[英]how to convert a string datetime with unknown timezone to timestamp in python
我有一个这样的日期时间Thu Jun 02 11:56:53 CDT 2011
我试图使用下面的代码将它转换为日期时间对象
from dateutil import parser
timestamp = parser.parse("Thu Jun 02 11:56:53 CDT 2011")
但我收到这个警告
UnknownTimezoneWarning: tzname CDT identified but not understood.
Pass `tzinfos` argument in order to correctly return a timezone-aware datetime.
In a future version, this raise an exception.
category=UnknownTimezoneWarning)
当我使用UTC
而不是CDT
时没有警告。 我可以使用tzinfos
来解决这个问题吗?
从https://www.timeanddate.com/time/zones/收集时区信息作为@pLOPeGG 答案,您可以用作演示
#!/usr/bin/env python
# encoding:utf-8
from dateutil import parser
whois_timezone_info = {
"A": 1 * 3600,
"ACDT": 10.5 * 3600,
"ACST": 9.5 * 3600,
"ACT": -5 * 3600,
"ACWST": 8.75 * 3600,
"ADT": 4 * 3600,
"AEDT": 11 * 3600,
"AEST": 10 * 3600,
"AET": 10 * 3600,
"AFT": 4.5 * 3600,
"AKDT": -8 * 3600,
"AKST": -9 * 3600,
"ALMT": 6 * 3600,
"AMST": -3 * 3600,
"AMT": -4 * 3600,
"ANAST": 12 * 3600,
"ANAT": 12 * 3600,
"AQTT": 5 * 3600,
"ART": -3 * 3600,
"AST": 3 * 3600,
"AT": -4 * 3600,
"AWDT": 9 * 3600,
"AWST": 8 * 3600,
"AZOST": 0 * 3600,
"AZOT": -1 * 3600,
"AZST": 5 * 3600,
"AZT": 4 * 3600,
"AoE": -12 * 3600,
"B": 2 * 3600,
"BNT": 8 * 3600,
"BOT": -4 * 3600,
"BRST": -2 * 3600,
"BRT": -3 * 3600,
"BST": 6 * 3600,
"BTT": 6 * 3600,
"C": 3 * 3600,
"CAST": 8 * 3600,
"CAT": 2 * 3600,
"CCT": 6.5 * 3600,
"CDT": -5 * 3600,
"CEST": 2 * 3600,
"CET": 1 * 3600,
"CHADT": 13.75 * 3600,
"CHAST": 12.75 * 3600,
"CHOST": 9 * 3600,
"CHOT": 8 * 3600,
"CHUT": 10 * 3600,
"CIDST": -4 * 3600,
"CIST": -5 * 3600,
"CKT": -10 * 3600,
"CLST": -3 * 3600,
"CLT": -4 * 3600,
"COT": -5 * 3600,
"CST": -6 * 3600,
"CT": -6 * 3600,
"CVT": -1 * 3600,
"CXT": 7 * 3600,
"ChST": 10 * 3600,
"D": 4 * 3600,
"DAVT": 7 * 3600,
"DDUT": 10 * 3600,
"E": 5 * 3600,
"EASST": -5 * 3600,
"EAST": -6 * 3600,
"EAT": 3 * 3600,
"ECT": -5 * 3600,
"EDT": -4 * 3600,
"EEST": 3 * 3600,
"EET": 2 * 3600,
"EGST": 0 * 3600,
"EGT": -1 * 3600,
"EST": -5 * 3600,
"ET": -5 * 3600,
"F": 6 * 3600,
"FET": 3 * 3600,
"FJST": 13 * 3600,
"FJT": 12 * 3600,
"FKST": -3 * 3600,
"FKT": -4 * 3600,
"FNT": -2 * 3600,
"G": 7 * 3600,
"GALT": -6 * 3600,
"GAMT": -9 * 3600,
"GET": 4 * 3600,
"GFT": -3 * 3600,
"GILT": 12 * 3600,
"GMT": 0 * 3600,
"GST": 4 * 3600,
"GYT": -4 * 3600,
"H": 8 * 3600,
"HDT": -9 * 3600,
"HKT": 8 * 3600,
"HOVST": 8 * 3600,
"HOVT": 7 * 3600,
"HST": -10 * 3600,
"I": 9 * 3600,
"ICT": 7 * 3600,
"IDT": 3 * 3600,
"IOT": 6 * 3600,
"IRDT": 4.5 * 3600,
"IRKST": 9 * 3600,
"IRKT": 8 * 3600,
"IRST": 3.5 * 3600,
"IST": 5.5 * 3600,
"JST": 9 * 3600,
"K": 10 * 3600,
"KGT": 6 * 3600,
"KOST": 11 * 3600,
"KRAST": 8 * 3600,
"KRAT": 7 * 3600,
"KST": 9 * 3600,
"KUYT": 4 * 3600,
"L": 11 * 3600,
"LHDT": 11 * 3600,
"LHST": 10.5 * 3600,
"LINT": 14 * 3600,
"M": 12 * 3600,
"MAGST": 12 * 3600,
"MAGT": 11 * 3600,
"MART": 9.5 * 3600,
"MAWT": 5 * 3600,
"MDT": -6 * 3600,
"MHT": 12 * 3600,
"MMT": 6.5 * 3600,
"MSD": 4 * 3600,
"MSK": 3 * 3600,
"MST": -7 * 3600,
"MT": -7 * 3600,
"MUT": 4 * 3600,
"MVT": 5 * 3600,
"MYT": 8 * 3600,
"N": -1 * 3600,
"NCT": 11 * 3600,
"NDT": 2.5 * 3600,
"NFT": 11 * 3600,
"NOVST": 7 * 3600,
"NOVT": 7 * 3600,
"NPT": 5.5 * 3600,
"NRT": 12 * 3600,
"NST": 3.5 * 3600,
"NUT": -11 * 3600,
"NZDT": 13 * 3600,
"NZST": 12 * 3600,
"O": -2 * 3600,
"OMSST": 7 * 3600,
"OMST": 6 * 3600,
"ORAT": 5 * 3600,
"P": -3 * 3600,
"PDT": -7 * 3600,
"PET": -5 * 3600,
"PETST": 12 * 3600,
"PETT": 12 * 3600,
"PGT": 10 * 3600,
"PHOT": 13 * 3600,
"PHT": 8 * 3600,
"PKT": 5 * 3600,
"PMDT": -2 * 3600,
"PMST": -3 * 3600,
"PONT": 11 * 3600,
"PST": -8 * 3600,
"PT": -8 * 3600,
"PWT": 9 * 3600,
"PYST": -3 * 3600,
"PYT": -4 * 3600,
"Q": -4 * 3600,
"QYZT": 6 * 3600,
"R": -5 * 3600,
"RET": 4 * 3600,
"ROTT": -3 * 3600,
"S": -6 * 3600,
"SAKT": 11 * 3600,
"SAMT": 4 * 3600,
"SAST": 2 * 3600,
"SBT": 11 * 3600,
"SCT": 4 * 3600,
"SGT": 8 * 3600,
"SRET": 11 * 3600,
"SRT": -3 * 3600,
"SST": -11 * 3600,
"SYOT": 3 * 3600,
"T": -7 * 3600,
"TAHT": -10 * 3600,
"TFT": 5 * 3600,
"TJT": 5 * 3600,
"TKT": 13 * 3600,
"TLT": 9 * 3600,
"TMT": 5 * 3600,
"TOST": 14 * 3600,
"TOT": 13 * 3600,
"TRT": 3 * 3600,
"TVT": 12 * 3600,
"U": -8 * 3600,
"ULAST": 9 * 3600,
"ULAT": 8 * 3600,
"UTC": 0 * 3600,
"UYST": -2 * 3600,
"UYT": -3 * 3600,
"UZT": 5 * 3600,
"V": -9 * 3600,
"VET": -4 * 3600,
"VLAST": 11 * 3600,
"VLAT": 10 * 3600,
"VOST": 6 * 3600,
"VUT": 11 * 3600,
"W": -10 * 3600,
"WAKT": 12 * 3600,
"WARST": -3 * 3600,
"WAST": 2 * 3600,
"WAT": 1 * 3600,
"WEST": 1 * 3600,
"WET": 0 * 3600,
"WFT": 12 * 3600,
"WGST": -2 * 3600,
"WGT": -3 * 3600,
"WIB": 7 * 3600,
"WIT": 9 * 3600,
"WITA": 8 * 3600,
"WST": 14 * 3600,
"WT": 0 * 3600,
"X": -11 * 3600,
"Y": -12 * 3600,
"YAKST": 10 * 3600,
"YAKT": 9 * 3600,
"YAPT": 10 * 3600,
"YEKST": 6 * 3600,
"YEKT": 5 * 3600,
"Z": 0 * 3600,
}
timestamp = parser.parse("Thu Jun 02 11:56:53 CDT 2011", tzinfos={"CDT": -5*3600})
简短的回答,不使用 tzinfos,用它的 UTC 等价物替换 CDT:
In [15]: from dateutil import parser
...: timestamp = parser.parse("Thu Jun 02 11:56:53 UTC-5 2011")
...:
...:
In [16]: timestamp
Out[16]: datetime.datetime(2011, 6, 2, 11, 56, 53, tzinfo=tzoffset(None, 18000))
您可以使用 tzinfos,它必须是一个字典,其中键是未知时区,值是字符串 UTC 格式(例如 UTC-5)或偏移的秒数,这里是文档:
津福斯
字符串中可能出现的其他时区名称/别名。 此参数将时区名称(以及可选的时区偏移量)映射到时区。 此参数可以是带有时区别名的字典,将时区名称映射到时区,也可以是带有两个参数(tzname 和 tzoffset)并返回时区的函数。 名称映射到的时区可以是 UTC 的整数偏移量(以秒为单位)或 tzinfo 对象。 如果设置了ignoretz,则忽略此参数。
我尝试了两种方法并进行了比较
timestamp = parser.parse("Thu Jun 02 11:56:53 CDT 2011", tzinfos={"CDT": -5*3600})
timestamp2 = parser.parse("Thu Jun 02 11:56:53 CDT 2011", tzinfos={"CDT": "UTC-5"})
timestamp3 = parser.parse("Thu Jun 02 11:56:53 UTC-0500 2011")
它打印
2011-06-02 11:56:53-05:00
2011-06-02 11:56:53-05:00
2011-06-02 11:56:53+05:00
似乎您在使用 tzinfos 时必须反转符号(纠正我,这可能是相反的事情)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.