我对 python 有点陌生,但在使用时间戳、utc 和 unixtime 方面遇到了最困难的时候。
此示例延迟了 2 小时:
sec_in_day=86400
today = datetime.datetime.utcnow()
print(today)
two_days_ago=today.timestamp()-(sec_in_day*2);
print("Two days ago (unix)",two_days_ago)
# Convert timestamp via 3rd party
tool:http://www.onlineconversion.com/unix_time.htm
#generated unix-timestamp is 2 hours early according to 3rd party tool
2017-04-11 06:36:49.414133
两天前(unix)1491712609.414133
通过在线工具转换 1491712609.414133 给了我
2017 年 4 月 9 日星期日 04:36:49 GMT
预计将于 2017 年 4 月 9 日星期日 06:36:49 GMT
这解决了我的问题
sec_in_day=86400
today = datetime.datetime.utcnow()
timestamp = today.replace(tzinfo=timezone.utc).timestamp()
print("Today",today)
print("Today-Re", today.replace(tzinfo=timezone.utc))
print("TS",timestamp)
print("TS#2",(timestamp-(sec_in_day*2)))
我相信一切都会按设计进行。
首先你要做:
today = datetime.datetime.utcnow()
采用UTC,没有夏令时调整,没有本地时区调整。
然后你就可以:
today.timestamp()
根据docs,这是当地时间,因此它包括对夏令时以及当地时区的调整。
这解释了 2 小时的差异。
您可能想了解的是
today - datetime.timedelta(days=2)
您也可以使用以下代码
sec_in_day=86400
today = datetime.datetime.utcnow()
print(today)
two_days_ago=today.timestamp()-(sec_in_day*2);
print("Two days ago (unix): ",datetime.datetime.fromtimestamp(two_days_ago).strftime('%Y-%m-%d %H:%M:%S.%f'))
在此我使用了 fromtimestamp(two_days_ago).strftime('%Y-%m-%d %H:%M:%S.%f')) 函数,它将把纪元时间转换为可读的形式。
我建议这个解决方案:
from zoneinfo import ZoneInfo
from datetime import datetime, timedelta
utc = datetime.now(ZoneInfo('UTC')) - timedelta(days=2)
print('Two days ago:', utc)
print('Two days ago (timestamp):', utc.timestamp())
print('Getting date from timestamp for verification:', datetime.fromtimestamp(utc.timestamp(), ZoneInfo('UTC')))
结果:
两天前:2024-09-20 18:17:41.788909+00:00
两天前(时间戳):1726856261.788909
从时间戳获取日期进行验证:2024-09-20 18:17:41.788909+00:00