如何在Python中的UTC中获取时间戳

时间:2019-01-10 19:32:39

标签: python timestamp

我使用的API的端点可以按日期过滤。日期必须是自纪元以来的时间戳(以秒为单位),并且必须采用UTC,以便可以正确过滤API

这是我今天尝试过的

first_day = datetime.utcnow().replace(day=1)
first_day = first_day.replace(hour=0, minute=0, second=0, microsecond=0)
print(first_day, int(first_day.timestamp()))

last_day =    datetime.utcnow().replace(day=calendar.monthrange(datetime.utcnow().year,     datetime.utcnow().month)[1])
last_day = last_day.replace(hour=0, minute=0, second=0, microsecond=0)
print(last_day, int(last_day.timestamp()))

这是我的输出

2019-01-01 00:00:00 1546318800
2019-01-31 00:00:00 1548910800

然后,当我将一月的第一天的时间戳记为1546318800,然后转到https://www.epochconverter.com/并将其粘贴到人类日期时,我得到以下信息:

GMT:2019年1月1日,星期二,5:00:00 AM 您的时区:2019年1月1日,星期二,格林尼治标准时间-05:00,格林尼治标准时间-05:00

我希望GMT时间为2019年1月1日上午12:00:00

我该怎么做?

1 个答案:

答案 0 :(得分:1)

您正在使用天真 datetime对象。对于一个简单的datetime对象,该时间假定为 local 时间,因此首先应用您的本地系统时区偏移量。来自`datetime.timestamp() documentation

  

假定朴素的datetime实例代表本地时间,并且此方法依赖于平台C mktime()函数来执行转换。

并进一步:

  

注意:没有直接从表示UTC时间的朴素datetime实例中获取POSIX时间戳的方法。如果您的应用程序使用此约定,并且您的系统时区未设置为UTC,则可以通过提供tzinfo=timezone.utc获得POSIX时间戳:

timestamp = dt.replace(tzinfo=timezone.utc).timestamp()

请注意,通过使用daetime.date对象并使用datetime.combine(),可以使日期计算逻辑更加容易;此方法还接受新的时区值,因此您可以在此阶段传递timezone.utc时区:

from datetime import datetime, date, time, timedelta, timezone

# create first and last day of the month
first_day = date.today().replace(day=1)
last_day = (first_day + timedelta(days=31)).replace(day=1) - timedelta(days=1)
first_day = int(datetime.combine(first_day, time.min, tzinfo=timezone.utc).timestamp())
last_day = int(datetime.combine(last_day, time.min, tzinfo=timezone.utc).timestamp())

上面的方法通过首先添加31天(保证无论当前情况如何,都保证在下个月到达),然后将该新日期降低到该月的第一天,然后减去一天,来计算该月的最后一天。

演示:

>>> from datetime import datetime, date, time, timedelta, timezone
>>> first_day = date.today().replace(day=1)
>>> last_day = (first_day + timedelta(days=31)).replace(day=1) - timedelta(days=1)
>>> first_day, last_day
(datetime.date(2019, 1, 1), datetime.date(2019, 1, 31))
>>> int(datetime.combine(first_day, time.min, tzinfo=timezone.utc).timestamp())
1546300800
>>> int(datetime.combine(last_day, time.min, tzinfo=timezone.utc).timestamp())
1548892800

请注意,在1月31日午夜,该月还有24小时没有被发现。您可能需要从上面的- timedelta(days=1)计算中删除last_day减法,以切换到2月1日午夜(1548979200),或使用time.max将时间戳转换为23:23:59( 31日(午夜前1秒钟)(1548979199)。