python - datetime with timezone to epoch
在下面的代码中,我正在计算现在的纪元和当天纪元的开始。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import time import pytz from datetime import datetime tz1 = pytz.timezone('CST6CDT') utc = pytz.timezone('UTC') now = pytz.UTC.localize(datetime.utcnow()) now_tz = now.astimezone(tz1) print now_tz print now_tz.strftime('%s') begin_day = now_tz.replace(hour=0, minute=0, second=0) print begin_day print begin_day.strftime('%s') |
打印声明:
1 2 3 4 | 2012-08-28 13:52:21.595718-05:00 1346187141 2012-08-28 00:00:00.595718-05:00 1346137200 |
使用CDT时区将时期转换为时间戳:
1346187141 - 2012年8月28日15:52:21,
1346137200 - 2012年8月28日02:00:00
我希望第二个时代开始,但现在是凌晨2点。 在转换为纪元时,它看起来仍然使用本地时区PST。
我究竟做错了什么 ? 或者这可以用不同的方式完成吗?
谢谢!
要将带有时区的日期时间转换为纪元(POSIX时间戳):
1 2 3 4 5 6 7 8 9 10 11 | from datetime import datetime import pytz tz = pytz.timezone('CST6CDT') # a datetime with timezone dt_with_tz = tz.localize(datetime(2012, 8, 28, 19, 33, 50), is_dst=None) # get timestamp ts = (dt_with_tz - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds() # -> 1346200430.0 |
它是如何在Python 3中为时区感知的
获得"现在的时代":
1 2 3 | from datetime import datetime now_epoch = (datetime.utcnow() - datetime(1970, 1, 1)).total_seconds() |
或者(假设
1 2 3 | import time now_epoch = time.time() |
获取"当前时代的开始"更为复杂,因为当前日期在不同的时区可能会有所不同:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from datetime import datetime, time import pytz tz = pytz.timezone('CST6CDT') # get current date in given timezone today = datetime.now(tz).date() # -> datetime.date(2013, 6, 22) # get beginning of current day in given timezone as a datetime with timezone midnight = tz.localize(datetime.combine(today, time(0, 0)), is_dst=None) # -> datetime.datetime(2013, 6, 22, 0, 0, tzinfo=<DstTzInfo 'CST6CDT'...>) # get timestamp ts = (midnight - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds() # -> 1371877200.0 |
请参阅如何为给定时区获取"午夜"的UTC时间?
假设UTC日期为"获得当天纪元的开始":
1 2 3 4 5 6 7 8 9 | from datetime import datetime, date # get current date in UTC utc_date = datetime.utcnow().date() # -> datetime.date(2013, 6, 23) # get timestamp ts = (utc_date - date(1970, 1, 1)).days * 86400 # -> 1371945600 |
请参阅在Python中将datetime.date/datetime.datetime转换为UTC时间戳。
注意:我的答案是错误的。 (我想删除它,但是在删除accept标志之前我无法删除它。)
请参阅J.F.Sebastian的回答。
下面的代码演示了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import calendar import pytz import datetime as dt tz1 = pytz.timezone('US/Eastern') utc = pytz.timezone('UTC') now = utc.localize(dt.datetime(2002, 10, 28), is_dst=None) now_tz = now.astimezone(tz1) now_epoch = calendar.timegm(now_tz.utctimetuple()) begin_day = tz1.normalize(now_tz.replace(hour=0, minute=0, second=0)) midnight = tz1.localize(dt.datetime.combine(now_tz, dt.time(0, 0)), is_dst=None) if begin_day != midnight: print(begin_day) # 2002-10-27 01:00:00-04:00 # my result -- is not midnight print(midnight) # 2002-10-27 00:00:00-04:00 # J.F.Sebastian's result is correct |
(原始答案编辑)
最新版本的简单日期(pypi版本0.2)将为您管理详细信息:
1 2 3 4 5 6 7 8 9 10 | >>> from simpledate import * >>> now_utc = SimpleDate(tz='UTC') >>> now_tz = now_utc.convert(tz='CST6CDT') >>> begin_day = now_tz.replace(hour=0, minute=0, second=0, microsecond=0) >>> now_utc.timestamp 1371950295.777453 >>> now_tz.timestamp 1371950295.777453 >>> begin_day.timestamp 1371877200.0 |
我们可以向后检查时间戳(尽管上面很清楚,切换时区并没有改变时期,而是转移到了一天的开始):
1 2 3 4 | >>> SimpleDate(1371877200.0, tz='CST6CDT') SimpleDate('2013-06-22 00:00:00.000000 CDT', tz='CST6CDT') >>> SimpleDate(1371877200.0, tz='UTC') SimpleDate('2013-06-22 05:00:00.000000 UTC') |