提问人:Qinghuan Li 提问时间:9/20/2023 最后编辑:FObersteinerQinghuan Li 更新时间:9/20/2023 访问量:58
utc 时间字符串转换为 Unix 时间戳,然后转换回 utc 日期时间字符串。但结果与原始结果不匹配
utc time string convert to Unix timestamp, and then convert back to utc date time string. But the result is not matched with the original one
问:
我希望“utc”和“utc_str_back”应该同时出现,但结果是不同的。代码如下:
#input
utc='2023-09-20T05:04:54'
#calculation
utc_time = datetime.strptime(utc, '%Y-%m-%dT%H:%M:%S')
utc_dn = utc_time.timestamp()
utc_back = datetime.fromtimestamp(utc_dn, tz=pytz.utc)
utc_str_back = utc_back.strftime('%Y-%m-%d %H:%M:%S %Z')
#output
utc_str_back ='2023-09-19 21:04:54 UTC'
答:
2赞
FObersteiner
9/20/2023
#1
Python 中的朴素日期时间是指本地时间,而不是 UTC。因此
utc_time = datetime.strptime(utc, '%Y-%m-%dT%H:%M:%S')
具有误导性; 将解释为当地时间。在你打电话的那一刻就出了问题utc_time
utc_dn = utc_time.timestamp()
该方法会将日期时间转换为 UTC,然后计算 Unix 时间(指 UTC)。timestamp
如何解决
朴素对象不包含足够的信息,无法明确地相对于其他日期/时间对象定位自身。
您的应用程序正是需要的。因此,请使用可识别的日期时间来避免歧义。前任:
from datetime import datetime, timezone
#input
utc='2023-09-20T05:04:54'
#calculation
utc_time = datetime.strptime(utc, '%Y-%m-%dT%H:%M:%S').replace(tzinfo=timezone.utc)
utc_dn = utc_time.timestamp()
utc_back = datetime.fromtimestamp(utc_dn, tz=timezone.utc)
utc_str_back = utc_back.strftime('%Y-%m-%d %H:%M:%S %Z')
#output
print(utc_str_back)
# 2023-09-20 05:04:54 UTC
P.S. Pytz 已弃用。
评论
0赞
Qinghuan Li
9/21/2023
问题已经解决了!感谢您对 pytz 的了解,那么我以后应该使用时区来替换 pytz 吗?
0赞
FObersteiner
9/21/2023
datetime 模块中的@QinghuanLi主要用于设置 UTC;如果您正在处理时区,则可以从 Python 3.9 开始使用 zoneinfo。timezone
0赞
Qinghuan Li
9/21/2023
很抱歉再次打扰。如果我想转换为某个本地时区,如何将时区字符串(可能来自时区查找器,如 local_timezone = tf.timezone_at(lng=Longitude, lat=Latitude))更改为可以通过日期时间识别的 tzinfo 子类?我知道pytz可以做到(pytz.timezone(local_timezone_str)),但是有没有更好的解决方案?谢谢!
0赞
Qinghuan Li
9/21/2023
我找到了方法:local_timezone = ZoneInfo(local_timezone_str) 谢谢!
2赞
Fatjon Freskina
9/20/2023
#2
如果输入已被视为 UTC,则不应将其转换为 UTC。当您调用时,您正在“UTCizing”该值。utc_back = datetime.fromtimestamp(utc_dn, tz=pytz.utc)
修复:
#input
utc='2023-09-20T05:04:54'
#calculation
utc_time = datetime.strptime(utc, '%Y-%m-%dT%H:%M:%S')
utc_dn = utc_time.timestamp()
utc_back = datetime.fromtimestamp(utc_dn) # <- modified
utc_str_back = utc_back.strftime('%Y-%m-%d %H:%M:%S %Z')
评论
1赞
FObersteiner
9/20/2023
这是正确的,原因错误。 将不包含日期时间“2023-09-20T05:04:54”UTC 的正确 Unix 时间。utc_dn
0赞
Qinghuan Li
9/21/2023
是的,它返回正确的输出,但我应该避免像 Fatjon 建议的那样出现时区的歧义。
评论