我使用的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
我该怎么做?
答案 0 :(得分:1)
您正在使用天真 datetime
对象。对于一个简单的datetime
对象,该时间假定为 local 时间,因此首先应用您的本地系统时区偏移量。来自`datetime.timestamp() documentation:
假定朴素的
datetime
实例代表本地时间,并且此方法依赖于平台Cmktime()
函数来执行转换。
并进一步:
注意:没有直接从表示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)。