如何将感知日期时间转换为POSIX时间戳?

时间:2017-06-28 04:45:38

标签: python-2.7 datetime pytz

我想在中心时区的特定日期指定12 PM,并调整夏令时(CDT)。然后,我想将其转换为POSIX时间戳。

我找到的第一件事是:

d = datetime.datetime(2017, 6, 27, 12, tzinfo=???)

但我没有具体的CDT课程。但是pytz会这样做:

z = pytz.timezone('EST5EDT')
d = datetime.datetime(2017, 6, 27, 12, tzinfo=z)

但是这不起作用(pytz文档说的很多,但我不明白为什么构造函数不能使用时区信息)。如果我使用11月(后退)或6月(前进),我仍会得到12:00:00-05:00作为时间部分。

即使这确实有效,转换为POSIX时间戳的方法也会假定一个天真的日期时间:

posix = time.mktime(d.timetuple())

此时间戳代表我当地时区的12PM。

然后有normalize()代码和示例,我觉得很难遵循:

au_dt = au_tz.normalize(utc_dt.astimezone(au_tz))

我还试图从1970年1月1日定义的时期中减去我的识别时间,但除非日期时间得到UTC偏移正确,否则这不起作用(参见上面的第二点)。

任何人都可以帮助我建立一个关于这些东西如何运作的心理模型,特别是这个问题的解决方案吗?

1 个答案:

答案 0 :(得分:0)

此解决方案似乎有效:

import pytz
import datetime

# Naive datetime (no timezone).
d = datetime.datetime(2017, 11, 27, 12)

cdt = pytz.timezone('US/Central')

# Give it a central time zone context.
d = cdt.localize(d)

# Determine the time in UTC.
d = d.astimezone(pytz.utc)

# Create a naive POSIX epoch.
epoch = datetime.datetime(1970, 1, 1)

# Give it context in the UTC time zone.
epoch = pytz.utc.localize(epoch)

# Number of seconds have elapsed since the epoch.
print (d - epoch).total_seconds()