我正在嘗試決議 Python 中 OFX 2.3 規范中指定的日期時間。我相信這是一種自定義格式,但如果它有名稱,請隨時告訴我。規范規定如下:
有一種表示日期、時間和時區的格式。完整的表格是:YYYYMMDDHHMMSS.XXX [gmt offset[:tz name]]
例如,“19961005132200.124[-5:EST]”代表東部標準時間 1996 年 10 月 5 日下午 1:22 和 124 毫秒。這與格林威治標準時間 (GMT) 下午 6:22 相同。
這是我目前的嘗試:
from datetime import datetime
date_str = "19961005132200.124[EST]"
date = datetime.strptime(date_str, "%Y%m%d%H%M%S.%f[%Z]")
到目前為止,這個部分示例有效,但缺少 GMT 偏移部分 (the -5 in [-5:EST])。我不確定如何指定最多兩位數的時區偏移量。
uj5u.com熱心網友回復:
這里需要注意的一些事情,首先(如評論):
- Python 內置的 strptime 在這里會遇到困難 -
%z不會決議單個數字偏移小時,%Z也不會決議一些(可能)不明確的時區縮寫。
然后,OFX 銀行 2.3 版檔案(第 3.2.8.2 節日期和日期時間)給我留下了一些問題:
- UTC 偏移量是可選的嗎?
- 為什么 EST 被稱為時區而它只是一個縮寫?
- 為什么在示例中,UTC 偏移量為 -5 小時,而在 1996 年 10 月 5 日,美國/東部時間為 UTC-4 ?
- 指定分鐘的偏移量怎么樣,例如 Asia/Calcutta 的 5:30 ?
- (自以為是)為什么首先要重新發明輪子而不是使用像 ISO 8601 這樣的常用標準?
無論如何,這是對自定義決議器的嘗試:
from datetime import datetime, timedelta, timezone
from zoneinfo import ZoneInfo
def parseOFXdatetime(s, tzinfos=None, _tz=None):
"""
parse OFX datetime string to an aware Python datetime object.
"""
# first, treat formats that have no UTC offset specified.
if not '[' in s:
# just make sure default format is satisfied by filling with zeros if needed
s = s.ljust(14, '0') '.000' if not '.' in s else s
return datetime.strptime(s, "%Y%m%d%H%M%S.%f").replace(tzinfo=timezone.utc)
# offset and tz are specified, so first get the date/time, offset and tzname components
s, off = s.strip(']').split('[')
off, name = off.split(':')
s = s.ljust(14, '0') '.000' if not '.' in s else s
# if tzinfos are specified, map the tz name:
if tzinfos:
_tz = tzinfos.get(name) # this might still leave _tz as None...
if not _tz: # ...so we derive a tz from a timedelta
_tz = timezone(timedelta(hours=int(off)), name=name)
return datetime.strptime(s, "%Y%m%d%H%M%S.%f").replace(tzinfo=_tz)
# some test strings
t = ["19961005132200.124[-5:EST]", "19961005132200.124", "199610051322", "19961005",
"199610051322[-5:EST]", "19961005[-5:EST]"]
for s in t:
print(# normal parsing
f'{s}\n {repr(parseOFXdatetime(s))}\n'
# parsing with tzinfo mapping supplied; abbreviation -> timezone object
f' {repr(parseOFXdatetime(s, tzinfos={"EST": ZoneInfo("US/Eastern")}))}\n\n')
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/390730.html
