[英]How can I get a human-readable timezone name in Python?
在我正在處理的 Python 項目中,我希望能夠獲得一個America/New_York形式的“人類可讀”時區名稱,對應於系統本地時區,以顯示給用戶。 我見過的每段訪問時區信息的代碼都只返回一個數字偏移量(-0400)或一個字母代碼(EDT),或者有時兩者都返回。 是否有一些 Python 庫可以訪問此信息,或者如果沒有,將偏移量/字母代碼轉換為人類可讀的名稱?
如果有多個與特定時區相對應的人類可讀名稱,則可能的結果列表或其中任何一個都可以,如果沒有與當前時區相對應的人類可讀名稱,我會采取異常或None
或[]
或其他。
澄清一下:我不記得我最初寫這個問題時的確切想法,但我認為我真正想要的是一種將時區變成人類可讀名稱的方法。 我不認為這個問題是為了專注於如何專門獲取系統本地時區,但對於我想到的特定用例,恰好本地時區是我想要的名稱。 我沒有編輯有關本地時區的問題,因為有兩個方面的答案。
下面生成一個 defaultdict 映射時區偏移量(例如'-0400')和縮寫(例如'EDT')到常見的地理時區名稱(例如'America/New_York')。
import os
import dateutil.tz as dtz
import pytz
import datetime as dt
import collections
result = collections.defaultdict(list)
for name in pytz.common_timezones:
timezone = dtz.gettz(name)
now = dt.datetime.now(timezone)
offset = now.strftime('%z')
abbrev = now.strftime('%Z')
result[offset].append(name)
result[abbrev].append(name)
for k, v in result.items():
print(k, v)
請注意,時區縮寫可以有非常不同的含義。 例如,“EST”可以代表澳大利亞的東部夏令時間 (UTC+10),或北美的東部標准時間 (UTC-5)。
此外,對於使用日光標准時間的地區,偏移量和縮寫可能會發生變化。 因此,保存靜態字典可能無法一年 365 天提供正確的時區名稱。
我希望能夠獲得與系統本地時區相對應的 America/New_York 形式的“人類可讀”時區名稱,以顯示給用戶。
有一個tzlocal
模塊,它返回一個對應於系統本地時區的pytz
tzinfo 對象(在tzlocal 3.0
版本之前):
#!/usr/bin/env python
import tzlocal # $ pip install tzlocal
# display "human-readable" name (tzid)
print(tzlocal.get_localzone_name())
# Example Results:
# -> Europe/Moscow
# -> America/Chicago
要回答標題中的問題(針對來自 google 的人),您可以使用%Z%z
打印本地時區信息:
#!/usr/bin/env python
import time
print(time.strftime('%Z%z'))
# Example Results:
# -> MSK+0300
# -> CDT-0500
它打印當前時區縮寫和與您當地時區相對應的 utc 偏移量。
http://pytz.sourceforge.net/可能會有所幫助。 如果不出意外,您也許可以獲取所有時區的列表,然后遍歷,直到找到與您的偏移量匹配的時區。
最初編寫此問題時,這可能不存在,但這里有一個獲取時區官方名稱的片段:
>>> eastern = timezone('US/Eastern')
>>> eastern.zone
'US/Eastern'
此外,這可以與非天真的日期時間對象(也就是使用pytz.<timezone>.localize(<datetime_object>)
或datetime_object.astimezone(pytz.<timezone>)
設置實際時區的日期時間)一起使用,如下所示:
>>> import datetime, pytz
>>> todaynow = datetime.datetime.now(tz=pytz.timezone('US/Hawaii'))
>>> todaynow.tzinfo # turned into a string, it can be split/parsed
<DstTzInfo 'US/Hawaii' HST-1 day, 14:00:00 STD>
>>> todaynow.strftime("%Z")
'HST'
>>> todaynow.tzinfo.zone
'US/Hawaii'
這當然是為了教育那些登陸這里的搜索引擎用戶。 ...在pytz 模塊站點上查看更多信息。
如果您只想要您所要求的字面意思,“America/New_York 形式的時區名稱,對應於系統本地時區”,並且如果您只關心 Linux(和類似的),那么這應該可以完成工作:
import os
import os.path
import sys
def main(argv):
tzname = os.environ.get('TZ')
if tzname:
print tzname
elif os.path.exists('/etc/timezone'):
print file('/etc/timezone').read()
else:
sys.exit(1)
if __name__ == '__main__':
main(sys.argv)
當然,擁有一個以更簡潔的方式封裝它的庫會更好,並且可能會處理您在評論中提到的其他情況,例如已經擁有tzinfo
對象。 我認為您可以使用 Amber 提到的pytz來做到這一點,但對我來說這並不明顯......
py> from dateutil.tz import *
py> ny = gettz('America/New York')
py> ny._filename
'/usr/share/zoneinfo/America/New_York'
py> ny._filename.split('/', 4)[-1]
'America/New_York'
# 使用 tzlocal 庫
from tzlocal import get_localzone
current_timezone = get_localzone()
zone = current_timezone.zone
print(zone)
使用截至今天 4.1 的最新版本 tzlocal, tzlocal.get_localzone().key
會產生以下錯誤: AttributeError: '_PytzShimTimezone' object has no attribute 'key'
。 但是tzlocal.get_localzone().zone
工作得很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.