如何使用python获取UTC日期时间、自动检测用户时区并将日期时间转换为所需格式?

如何使用python获取UTC日期时间、自动检测用户时区并将日期时间转换为所需格式?,python,datetime,timezone,utc,Python,Datetime,Timezone,Utc,有很多关于UTC日期时间转换的问题,似乎没有一个“最佳方式”的共识 根据这一点:,pytz是最好的方式。他演示了如何转换为时区,如图所示datetime.datetime.utcnow().replace(tzinfo=pytz.utc),但他没有说明如何获取用户的时区 这家伙说“localize调整夏令时,replace不调整” 我看到的每个使用pytz的人都在提供他们自己的时区(users\u timezone=timezone(“US/Pacific”)),我不明白这一点,因为你不知道你的

有很多关于UTC日期时间转换的问题,似乎没有一个“最佳方式”的共识

根据这一点:,pytz是最好的方式。他演示了如何转换为时区,如图所示
datetime.datetime.utcnow().replace(tzinfo=pytz.utc)
,但他没有说明如何获取用户的时区

这家伙说“
localize
调整夏令时,
replace
不调整”

我看到的每个使用pytz的人都在提供他们自己的时区(
users\u timezone=timezone(“US/Pacific”)
),我不明白这一点,因为你不知道你的查看器是否在那里

这家伙有一种自动检测时区的方法,但它使用的是
dateutil
库,而不是像Armin Ronacher和官方python文档所推荐的那样使用pytz(,就在黄色框中锚的上方)

我所需要的是最简单的、经得起未来考验的、全夏令时(datetime)的方式。utcnow()戳记(
2012-08-25 10:59:56.511479
),将其转换为用户的时区。然后像这样展示:

Aug 25 - 10:59AM
如果这一年不是今年,我想说

Aug 25 '11 - 10:59AM
好的,这是(也是我对SO的第一个贡献:)

它确实需要2个外部库,这可能会导致一些错误

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

我了解到tzlocal()在heroku上根本不起作用。上面的函数只是返回UTC时间。另外请注意,我完全不希望它们是准确确定用户时区和自动调整时间的可靠方法。我看到twitter有一个设置来调整你的时区,所以这必须是一种方式:存储用户的偏好,并使用它进行转换。