我现在能想到的最好的办法就是这个怪物:
>>> datetime.utcnow() \
... .replace(tzinfo=pytz.UTC) \
... .astimezone(pytz.timezone("Australia/Melbourne")) \
... .replace(hour=0,minute=0,second=0,microsecond=0) \
... .astimezone(pytz.UTC) \
... .replace(tzinfo=None)
datetime.datetime(2008, 12, 16, 13, 0)
即,在英语中,获取当前时间(以UTC为单位),将其转换为其他时区,将时间设置为午夜,然后转换回UTC。
我不仅仅使用now()或localtime(),因为这将使用服务器的时区,而不是用户的时区。
我忍不住觉得我错过了什么,有什么想法吗?
@hop's answer在从夏令时(DST)过渡的当天出错,例如2012年4月1日。要修复它,可以使用^{} :
评论也一样:
如果你这样做的话,我想你可以省去一些方法调用:
但是…在你的代码中有一个比美观更大的问题:它会在切换到夏令时或从夏令时切换到夏令时时时给出错误的结果。
原因是datetime构造函数和
replace()
都没有考虑DST更改。例如:
但是,
tz.localize()
的文档说明:这样,你的问题就这样解决了:
不过,1582年之前的日期没有保证。
dateutil.tz比pytz更直接:
从Python 3.6开始,tzinfo documentation推荐使用dateutil.tz。来自dateutil.tz的tzinfo对象在不需要pytz的本地化功能的情况下,与DST这样的异常没有问题。使用来自user3850的示例:
相关问题 更多 >
编程相关推荐