我需要能夠將存盤為基于區域的字串的時區轉換為 UTC 時區或跨位置的公共時區。例如,“Canada/Vancouver”和“Americas/Los_Angeles”都應決議為“US/Pacific”。此解決方案也適用于其他時區,如“加拿大/多倫多”和“美國/紐約”到“美國/東部”,也適用于其他地區的時區,如墨西哥等。
我不知道該怎么做,甚至不考慮這個。我可以將其轉換為 UTC-7,但這不能處理 PST 與 PDT 的轉換。
有人可以幫忙嗎?
編輯:閱讀評論和答案后,我意識到我的問題還不夠清楚。我有一組電話號碼,我使用“phonenumbers”包以更新的格式為每個號碼獲取時區,但我想按照舊的區域時區命名約定來計算唯一電話號碼的數量。因此,我想將更新的“大陸/城市”時區轉換為“國家/地區”時區。. UTC 只是我試圖想出一種將地區/城市格式轉換為通用名稱的方法。
uj5u.com熱心網友回復:
時區從IANA資料庫是指區域地理概念。另一方面,UTC 不是時區,它是通用的(不特定于某個地區)。
- 對于時區,您可以與 UTC 有一個偏移量(例如
UTC-8比 UTC 晚 8 小時)。 - 給定時區中的某個日期/時間具有特定的 UTC 偏移量,該偏移量源自該時區的規則(何時應用 DST 等)。
- 反過來,某個 UTC 偏移量可以在給定日期/時間應用于多個時區,因此映射回需要一個定義,否則它是模棱兩可的。
關于時區的命名,首選“大陸/城市”風格的時區名稱。像“US/Pacific”這樣的舊名稱(從 1993 年開始)保留在資料庫中以實作向后兼容性 - 另請參閱eggert-tz/backward。
Python >= 3.9 通過zoneinfo模塊通過標準庫支持 IANA 時區。使用它,您可以輕松創建有意識的日期時間物件并獲取它們的 UTC 偏移量,例如
from datetime import datetime
from zoneinfo import ZoneInfo
tznames = ["America/Vancouver", "America/Los_Angeles",
"America/Toronto", "America/New_York", "Europe/Berlin"]
def timedelta_to_str(td):
hours, seconds = divmod(td.total_seconds(), 3600)
return f"{int(hours): }:{int(seconds/60):02d}"
now = datetime.now().replace(microsecond=0)
for z in tznames:
local_now = now.astimezone(ZoneInfo(z))
print(f"now in zone {z}:\n\t{local_now.isoformat(' ', timespec='seconds')}, "
f"UTC offset: {timedelta_to_str(local_now.utcoffset())} hours\n")
# or also e.g. print(f"local time {z}:\n\t{local_now}, UTC offset: {local_now.strftime('%z')}\n")
# now in zone America/Vancouver:
# 2022-01-12 06:30:08-08:00, UTC offset: -08:00 hours
# now in zone America/Los_Angeles:
# 2022-01-12 06:30:08-08:00, UTC offset: -08:00 hours
# now in zone America/Toronto:
# 2022-01-12 09:30:08-05:00, UTC offset: -05:00 hours
# now in zone America/New_York:
# 2022-01-12 09:30:08-05:00, UTC offset: -05:00 hours
# now in zone Europe/Berlin:
# 2022-01-12 15:30:08 01:00, UTC offset: 01:00 hours
另見 SO:
- Python:datetime tzinfo 時區名稱檔案
- 顯示不同時區的時間
- 將 timedelta 格式化為字串
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/409553.html
標籤:
