python - 日期时间与时区到纪元

t0x*_*x13 8 python timezone datetime epoch

在下面的代码中,我正在计算现在的纪元和当天纪元的开始.

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')
Run Code Online (Sandbox Code Playgroud)

打印声明:

2012-08-28 13:52:21.595718-05:00
1346187141
2012-08-28 00:00:00.595718-05:00
1346137200
Run Code Online (Sandbox Code Playgroud)

使用CDT时区将时期转换为时间戳:1346187141 - 2012年8月28日15:52:21,1346137200 - 2012年8月28日02:00:00

我希望第二个时代开始,但现在是凌晨2点.在转换为纪元时,它看起来仍然使用本地时区PST.

我究竟做错了什么 ?或者这可以用不同的方式完成吗?

谢谢!

jfs*_*jfs 26

要将带有时区的日期时间转换为纪元(POSIX时间戳):

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
Run Code Online (Sandbox Code Playgroud)

这是在Python 3中为时datetime.timestamp区感知datetime对象实现方法的方法.

获得"现在的时代":

from datetime import datetime

now_epoch = (datetime.utcnow() - datetime(1970, 1, 1)).total_seconds()
Run Code Online (Sandbox Code Playgroud)

或者(假设time使用POSIX纪元):

import time

now_epoch = time.time()
Run Code Online (Sandbox Code Playgroud)

获取"当前时代的开始"更为复杂,因为当前日期在不同的时区可能会有所不同:

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 
Run Code Online (Sandbox Code Playgroud)

请参阅如何为给定时区获取"午夜"的UTC时间?.

假设UTC日期为"获得当天纪元的开始":

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
Run Code Online (Sandbox Code Playgroud)

请参阅在Python中将datetime.date/datetime.datetime转换为UTC时间戳.


unu*_*tbu 6

注意:我的答案是错误的.(我想删除它,但是在删除accept标志之前我无法删除它.)

请参阅JFSebastian的回答.

下面的代码演示了now_tz我们的两种方法产生不同结果的值.

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
Run Code Online (Sandbox Code Playgroud)

(原始答案编辑)