在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年3月3日在蒙特利尔的午夜,所以(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_time4
对象的简单方法localized_time3
,因为我想在同一时间(此处为午夜)获得下一个本地化的日期。我尝试了timedelta
,但我认为它不知道时区或DST:
>>> 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转换的时间。
不使用新软件包:
def add_day(x):
d = x.date()+DT.timedelta(1)
return mtl.localize(x.replace(year=d.year, month=d.month, day=d.day, tzinfo=None))
完整脚本:
import datetime as DT
import pytz
import calendar
mtl = pytz.timezone('America/Montreal')
naive_time3 = DT.datetime.strptime('2013/11/03', '%Y/%m/%d')
print repr(naive_time3)
#datetime.datetime(2013, 11, 3, 0, 0)
localized_time3 = mtl.localize(naive_time3)
print repr(localized_time3)
#datetime.datetime(2013, 11, 3, 0, 0, tzinfo=<DstTzInfo 'America/Montreal' EDT-1 day, 20:00:00 DST>)
print calendar.timegm(localized_time3.utctimetuple())
#1383451200.0
def add_day(x):
d = x.date()+DT.timedelta(1)
return mtl.localize(x.replace(year=d.year, month=d.month, day=d.day, tzinfo=None))
print repr(add_day(localized_time3))
#datetime.datetime(2013, 11, 4, 0, 0, tzinfo=<DstTzInfo 'America/Montreal' EST-1 day, 19:00:00 STD>)
(calendar
适用于Python2。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句