2010-08-15 53 views
9

Trong dự án Python tôi đang làm việc, tôi muốn có thể nhận được tên múi giờ "có thể đọc được" của biểu mẫu America/New_York, tương ứng với múi giờ địa phương của hệ thống, để hiển thị cho người dùng . Mỗi đoạn mã tôi đã thấy rằng việc truy cập thông tin múi giờ chỉ trả về số bù (-0400) hoặc mã thư (EDT) hoặc đôi khi cả hai. Có một số thư viện Python có thể truy cập thông tin này, hoặc nếu không, chuyển đổi mã offset/letter thành tên có thể đọc được?Làm cách nào để có được tên múi giờ có thể đọc được bằng Python?

Nếu có nhiều hơn một tên người có thể đọc được tương ứng với múi giờ cụ thể, danh sách kết quả có thể hoặc bất kỳ kết quả nào là tốt và nếu không có tên có thể đọc được tương ứng với múi giờ hiện tại, Tôi sẽ có ngoại lệ hoặc None hoặc [] hoặc bất kỳ thứ gì.

+2

bạn cần phải cẩn thận với cách bạn sử dụng điều này tôi nghĩ. chỉ là một ví dụ: khi ở châu Âu/Rome chúng tôi chuyển từ CEST sang CET vào tháng 10 năm 2010, cả hai '2010-10-31T02: 30: 00CEST' và '2010-10-31T02: 30: 00CET' đã được ghi lại, tương đương với '2010-10-31T00: 30: 00UTC' và cột còn lại là' 2010-10-31T01: 30: 00UTC'. '2010-10-31T02: 30: 00 Châu Âu/Rome' sẽ không rõ ràng. – mariotomo

Trả lời

8

http://pytz.sourceforge.net/ có thể trợ giúp. Nếu không có gì khác, bạn có thể lấy một danh sách tất cả các múi giờ và sau đó lặp lại cho đến khi bạn tìm thấy một phù hợp với bù đắp của bạn.

+3

Lặp lại không phải là một ý tưởng tồi. Tôi sẽ lặp lại tất cả chúng một lần và xây dựng một tệp 'shelve' hoặc chỉ lưu trữ một' dict' trong một mô đun hoặc một cái gì đó được khóa bằng mã thư. Sau đó, bạn chỉ có thể gửi 'dict' với ứng dụng và không phải thực hiện tìm kiếm hai lần. Bạn thậm chí sẽ không phải gửi 'pytz' trong trường hợp đó: bạn chỉ có thể sử dụng nó trong kịch bản để xây dựng' dict' – aaronasterling

+1

Yep. Đó là một cái gì đó hoạt động tốt với chỉ tính toán trước (hoặc thậm chí chỉ xây dựng nó khi khởi động; nó không mất * đó * dài nếu bạn chỉ làm nó một lần cho mỗi lần thực hiện). – Amber

+1

[Mô-đun 'tzlocal' có thể tìm đối tượng' pytz' tzinfo tương ứng với múi giờ địa phương] (http://stackoverflow.com/a/35086646/4279) – jfs

1

Check-out 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' 
+0

Nhưng điều đó không giúp tôi nếu tôi có một đối tượng 'tzinfo' không được lấy từ' dateutil.tz.gettz' - ví dụ, một từ 'pytz' - hoặc nếu tôi chỉ gọi' gettz() '(trong trường hợp đó tên tệp là '/ etc/localtime'). (Tôi vẫn đánh giá cao thông tin) –

+0

Vâng, các đối tượng múi giờ này đến từ đâu? Bạn có thể lưu trữ tên của múi giờ - đối số chuỗi thành 'gettz' - và reconstitute múi giờ bằng cách sử dụng đối số đó và' gettz'. Tôi đoán tôi giả sử một số trường hợp sử dụng, ví dụ như lưu trữ một thời gian và chuỗi múi giờ liên quan trong một cơ sở dữ liệu. Tôi sẽ không bao giờ sử dụng 'gettz' bởi chính nó để có được múi giờ địa phương, nhưng cũng trong trường hợp của tôi người dùng sẽ là một người đứng sau một trình duyệt web. –

9

Sau đây tạo ra một ánh xạ defaultdict offsets múi giờ (ví dụ như '-0400') và chữ viết tắt (ví dụ như 'EDT') để tên múi giờ địa lý thông thường (ví dụ như '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)  
print(result) 

Lưu ý rằng từ viết tắt múi giờ có thể có vastly different meanings. Ví dụ: 'EST' có thể phù hợp với Giờ mùa đông phương Đông (UTC + 10) ở Úc hoặc Giờ chuẩn miền Đông (UTC-5) ở Bắc Mỹ.

Ngoài ra, bù trừ và chữ viết tắt có thể thay đổi cho các khu vực sử dụng thời gian tiêu chuẩn ban ngày. Vì vậy, việc lưu dict tĩnh có thể không cung cấp tên múi giờ chính xác 365 ngày một năm.

3

Nếu bạn chỉ muốn theo nghĩa đen những gì bạn yêu cầu, "tên múi giờ của biểu mẫu America/New_York, tương ứng với múi giờ địa phương" và nếu bạn chỉ quan tâm đến Linux (và tương tự), thì điều này sẽ làm công việc:

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) 

Tất nhiên nó sẽ đẹp hơn để có một thư viện mà gói gọn này một cách sạch hơn, và rằng có lẽ xử lý các trường hợp khác mà bạn đề cập đến trong ý kiến ​​như đã có một đối tượng tzinfo. Tôi nghĩ bạn có thể làm điều đó với pytz được đề cập bởi Amber nhưng không rõ ràng đối với tôi như thế nào ...

4

Tôi muốn có thể nhận được tên múi giờ "có thể đọc được" của biểu mẫu America/New_York, tương ứng với múi giờ địa phương của hệ thống, để hiển thị cho người dùng.

tzlocal module mà trả về một pytz tzinfo đối tượng tương ứng với hệ thống múi giờ địa phương:

#!/usr/bin/env python 
import tzlocal # $ pip install tzlocal 

print(tzlocal.get_localzone().zone) # display "human-readable" name (tzid) 
# -> Europe/Moscow 

Để trả lời câu hỏi trong tiêu đề (đối với người từ google), bạn có thể sử dụng %Z%z để in thông tin múi giờ địa phương:

#!/usr/bin/env python 
import time 

print(time.strftime('%Z%z')) 
# -> MSK+0300 

Nó in chữ viết tắt múi giờ hiện tại và giá trị bù trừ tương ứng với múi giờ địa phương của bạn.

Các vấn đề liên quan