时区为epoch的datetime



在下面的代码中,我正在计算现在的epoch和当天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')

打印报表:

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。

我做错了什么?或者可以用不同的方式来完成?

谢谢!

将带时区的日期时间转换为epoch(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

这就是如何在Python3中为具有时区意识的datetime对象实现datetime.timestamp方法。

获得"现在的时代":

from datetime import datetime
now_epoch = (datetime.utcnow() - datetime(1970, 1, 1)).total_seconds()

或者(假设time使用POSIX epoch):

import time
now_epoch = time.time()

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

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日期,获取"当前日期的开始时间":

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时间戳。

注意:我的答案完全错误(我想删除它,但在删除接受标志之前无法删除。)

请看J.F.Sebastian的回答。

以下是演示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

(原始答案经过编辑)

最新发布的简单日期(pypi上的0.2版本)将为您管理详细信息:

>>> 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

我们可以向后查看时间戳(尽管上面很清楚,切换时区并没有改变纪元,而移动到一天的开始确实改变了):

>>> 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')

相关内容

  • 没有找到相关文章

最新更新