【发布时间】:2013-12-15 02:29:59
【问题描述】:
在 Python 中,我可以找到本地时间的 Unix 时间戳,知道时区,就像这样(使用 pytz):
>>> import datetime as DT
>>> import pytz
>>> mtl = pytz.timezone('America/Montreal')
>>> naive_time3 = DT.datetime.strptime('2013/11/03', '%Y/%m/%d')
>>> naive_time3
datetime.datetime(2013, 11, 3, 0, 0)
>>> localized_time3 = mtl.localize(naive_time3)
>>> localized_time3
datetime.datetime(2013, 11, 3, 0, 0, tzinfo=<DstTzInfo 'America/Montreal' EDT-1 day, 20:00:00 DST>)
>>> localized_time3.timestamp()
1383451200.0
到目前为止,一切都很好。 naive_time 不知道时区,而 localized_time 知道它在 2013/11/03 蒙特利尔的午夜,因此 (UTC) Unix 时间戳很好。这个时区也是我的本地时区,这个时间戳似乎是正确的:
$ date -d @1383451200
Sun Nov 3 00:00:00 EDT 2013
现在,蒙特利尔的时钟已于 11 月 3 日 2:00 提前一小时调整,因此我们当天多出了一个小时。这意味着在 2013/11/03 和 2013/11/04 之间有 25 小时。这表明它:
>>> naive_time4 = DT.datetime.strptime('2013/11/04', '%Y/%m/%d')
>>> localized_time4 = mtl.localize(naive_time4)
>>> localized_time4
datetime.datetime(2013, 11, 4, 0, 0, tzinfo=<DstTzInfo 'America/Montreal' EST-1 day, 19:00:00 STD>)
>>> (localized_time4.timestamp() - localized_time3.timestamp()) / 3600
25.0
现在,我正在寻找一种从localized_time3 获取localized_time4 对象的简单方法,因为我知道我想在同一时间(此处为午夜)获取下一个本地化日期.我试过timedelta,但我相信它不知道时区或夏令时:
>>> localized_time4td = localized_time3 + DT.timedelta(1)
>>> localized_time4td
datetime.datetime(2013, 11, 4, 0, 0, tzinfo=<DstTzInfo 'America/Montreal' EDT-1 day, 20:00:00 DST>)
>>> (localized_time4td.timestamp() - localized_time3.timestamp()) / 3600
24.0
我的目的是获取有关每个本地日期的日志条目的信息,这些条目与它们的 Unix 时间戳一起存储。当然,如果我使用localized_time3.timestamp() 并在此处添加24 * 3600(与localized_time4td.timestamp() 相同),我将错过localized_time4td.timestamp() 和localized_time4td.timestamp() + 3600 之间发生的所有日志条目。
换句话说,我正在寻找的函数或方法应该知道何时将 25 小时、24 小时或 23 小时添加到 Unix 时间戳,具体取决于 DST 转换发生的时间。
【问题讨论】:
-
必须是std lib模块还是可以使用pip模块?
-
如果轻量级 PyPI 模块提供了非常简单的解决方案,我愿意使用它们。例如,我打算使用
pytz。 -
我建议你看看优秀的 Arrow (crsmithdev.com/arrow)。
-
@rdodev:Arrow 似乎效果很好(刚刚尝试过)!您想通过工作示例提供答案(我会接受),还是应该使用 Arrow 回答我自己的问题?还是谢谢你。
-
很高兴为您提供帮助!来吧,自己回答。我的时间有点短。
标签: python timezone dst pytz localtime