【PYTHON】如何使用python獲取UTC日期時間,自動檢測使用者時區並將日期時間轉換為所需格式?

2020-12-01 PYTHON

有很多關於UTC日期時間轉換的問題,似乎沒有一個“最佳方式”的共識。
根據這個:http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/,pytz是最好的方法。他展示瞭如何轉換成時區,但他沒有說明如何獲取使用者的時區…
這傢伙說“根據夏令時調整,datetime.datetime.utcnow().replace(tzinfo=pytz.utc)不”
我看到的每一個使用pytz的人都在提供他們自己的時區(localize),我不明白,因為你不知道你的觀眾在哪裡……
這傢伙有一種自動檢測時區的方法,但這是使用replace庫,而不是pytz,正如armin ronacher和python官方文件所建議的那樣(https://stackoverflow.com/a/7465359/523051,就在黃色框中的錨上方)
我所需要的是最簡單的、經得起未來考驗的、所有夏時制的時間/etc,以這種方式獲取我的datetime.utcnow()標記(users_timezone = timezone("US/Pacific")),並將其轉換為使用者的時區。像這樣展示:

Aug 25 - 10:59AM

如果今年不是現在,我想說
Aug 25 '11 - 10:59AM

解決辦法

好的,這是(同時,我對so的第一個貢獻:)
它確實需要兩個外部庫,這可能會導致一些…

from datetime import datetime
from dateutil import tz
import pytz

def standard_date(dt):
    """Takes a naive datetime stamp, tests if time ago is > than 1 year,
       determines user's local timezone, outputs stamp formatted and at local time."""

    # determine difference between now and stamp
    now = datetime.utcnow()
    diff = now - dt

    # show year in formatting if date is not this year
    if (diff.days / 365) >= 1:
        fmt = "%b %d '%y @ %I:%M%p"
    else:
        fmt = '%b %d @ %I:%M%p'   

    # get users local timezone from the dateutils library
    # http://stackoverflow.com/a/4771733/523051
    users_tz = tz.tzlocal()

    # give the naive stamp timezone info
    utc_dt = dt.replace(tzinfo=pytz.utc)
    # convert from utc to local time
    loc_dt = utc_dt.astimezone(users_tz)
    # apply formatting
    f = loc_dt.strftime(fmt)

    return f

出處

Have any Question?

Let us answer it!