簡體   English   中英

如何在 Python 中獲得人類可讀的時區名稱?

[英]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來做到這一點,但對我來說這並不明顯......

查看python-dateutil

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM