2009-11-09 39 views

Trả lời

11

Điều đó có thể sẽ không hoạt động vì những chữ viết tắt đó không phải là duy nhất. Xem this page để biết chi tiết. Bạn có thể chỉ cần tự mình xử lý nó nếu bạn đang làm việc với một bộ đầu vào đã biết.

+0

Sẽ dễ dàng hơn nếu chúng tôi giới hạn thời gian ở múi giờ ở Hoa Kỳ? Có một bộ chữ viết tắt "chuẩn" trong sự kiện đó không? –

+0

Đừng quên rằng "múi giờ ở Hoa Kỳ" bao gồm AKST, AKDT, HAST và HADT. Nếu bạn chỉ có nghĩa là 48 tiểu bang lục địa, thì bạn chỉ có 8 múi giờ 3 ký tự để xử lý (4 múi giờ, thời gian tiết kiệm tiêu chuẩn và ánh sáng ban ngày). – PaulMcG

+0

Rõ ràng để đo lường tốt, một số nơi sử dụng HST và HDT tương đương với HAST và HADT = \ –

5

Hàm phân tích cú pháp() trong dateutil không thể xử lý múi giờ. Điều tôi đang sử dụng là trình định dạng% Z và hàm time.strptime(). Tôi không có ý tưởng làm thế nào nó đề cập đến sự mơ hồ trong các múi giờ, nhưng có vẻ như để nói sự khác biệt giữa CDT và CST, đó là tất cả những gì tôi cần.

Nền: Tôi lưu trữ hình ảnh sao lưu trong các thư mục có tên là dấu thời gian sử dụng giờ địa phương, vì tôi không có đồng hồ GMT tiện dụng ở nhà. Vì vậy, tôi sử dụng time.strptime (d, r "% Y-% m-% dT% H:% M:% S_% Z") để phân tích các tên thư mục trở lại vào thời gian thực tế để phân tích độ tuổi.

+0

Như tôi đã hiểu, các giao dịch hàng không với sự mơ hồ bằng cách chỉ chấp nhận thời gian được đưa ra trong cài đặt múi giờ hiện tại. – Random832

55

dateutil 's parser.parse() chấp nhận làm đối số từ khóa tzinfos từ điển loại {'EST': -5*3600} (có nghĩa là, khớp với tên vùng để bù giờ GMT trong giây). Vì vậy, giả sử chúng ta có điều đó, chúng ta có thể làm:

>>> import dateutil.parser as dp 
>>> s = 'Sat, 11/01/09 8:00PM' 
>>> for tz_code in ('PST','PDT','MST','MDT','CST','CDT','EST','EDT'): 
>>>  dt = s+' '+tz_code 
>>>  print dt, '=', dp.parse(dt, tzinfos=tzd) 

Sat, 11/01/09 8:00PM PST = 2009-11-01 20:00:00-08:00 
Sat, 11/01/09 8:00PM PDT = 2009-11-01 20:00:00-07:00 
Sat, 11/01/09 8:00PM MST = 2009-11-01 20:00:00-07:00 
Sat, 11/01/09 8:00PM MDT = 2009-11-01 20:00:00-06:00 
Sat, 11/01/09 8:00PM CST = 2009-11-01 20:00:00-06:00 
Sat, 11/01/09 8:00PM CDT = 2009-11-01 20:00:00-05:00 
Sat, 11/01/09 8:00PM EST = 2009-11-01 20:00:00-05:00 
Sat, 11/01/09 8:00PM EDT = 2009-11-01 20:00:00-04:00 

Về nội dung của tzinfos, đây là cách tôi cư tôi:

tz_str = '''-12 Y 
-11 X NUT SST 
-10 W CKT HAST HST TAHT TKT 
-9 V AKST GAMT GIT HADT HNY 
-8 U AKDT CIST HAY HNP PST PT 
-7 T HAP HNR MST PDT 
-6 S CST EAST GALT HAR HNC MDT 
-5 R CDT COT EASST ECT EST ET HAC HNE PET 
-4 Q AST BOT CLT COST EDT FKT GYT HAE HNA PYT 
-3 P ADT ART BRT CLST FKST GFT HAA PMST PYST SRT UYT WGT 
-2 O BRST FNT PMDT UYST WGST 
-1 N AZOT CVT EGT 
0 Z EGST GMT UTC WET WT 
1 A CET DFT WAT WEDT WEST 
2 B CAT CEDT CEST EET SAST WAST 
3 C EAT EEDT EEST IDT MSK 
4 D AMT AZT GET GST KUYT MSD MUT RET SAMT SCT 
5 E AMST AQTT AZST HMT MAWT MVT PKT TFT TJT TMT UZT YEKT 
6 F ALMT BIOT BTT IOT KGT NOVT OMST YEKST 
7 G CXT DAVT HOVT ICT KRAT NOVST OMSST THA WIB 
8 H ACT AWST BDT BNT CAST HKT IRKT KRAST MYT PHT SGT ULAT WITA WST 
9 I AWDT IRKST JST KST PWT TLT WDT WIT YAKT 
10 K AEST ChST PGT VLAT YAKST YAPT 
11 L AEDT LHDT MAGT NCT PONT SBT VLAST VUT 
12 M ANAST ANAT FJT GILT MAGST MHT NZST PETST PETT TVT WFT 
13 FJST NZDT 
11.5 NFT 
10.5 ACDT LHST 
9.5 ACST 
6.5 CCT MMT 
5.75 NPT 
5.5 SLT 
4.5 AFT IRDT 
3.5 IRST 
-2.5 HAT NDT 
-3.5 HNT NST NT 
-4.5 HLV VET 
-9.5 MART MIT''' 

tzd = {} 
for tz_descr in map(str.split, tz_str.split('\n')): 
    tz_offset = int(float(tz_descr[0]) * 3600) 
    for tz_code in tz_descr[1:]: 
     tzd[tz_code] = tz_offset 

ps. mỗi @Hank Gay đặt tên múi giờ không được xác định rõ ràng. Để tạo thành bảng của tôi, tôi đã sử dụng http://www.timeanddate.com/library/abbreviations/timezones/http://en.wikipedia.org/wiki/List_of_time_zone_abbreviations. Tôi đã xem xét từng xung đột và giải quyết xung đột giữa các tên ít người biết đến và phổ biến đối với các tên phổ biến (được sử dụng nhiều hơn). Có một - IST - đó không phải là cắt càng rõ ràng (nó có thể có nghĩa là Indian Standard Time, Iran chuẩn Time, Ailen Giờ chuẩn hoặc Israel Chuẩn Thời gian), do đó, tôi rời nó ra khỏi bảng - bạn có thể cần phải chọn những gì để thêm cho nó dựa trên vị trí của bạn. Oh - và tôi rời khỏi Cộng hòa Kiribati với sự ngớ ngẩn của họ "nhìn tôi đây tôi là người đầu tiên chào mừng năm mới" GMT + 13 và GMT + 14 múi giờ.

+3

thiết thực, đơn giản và gọn gàng! –

+1

Tôi không thể nhận được [ChST] (http://en.wikipedia.org/wiki/Chamorro_Time_Zone) để hoạt động. Chữ thường ** h ** đó dường như gây ra sự cố. Tôi đã phải sử dụng viết hoa CHST trong danh sách các múi giờ và làm 'dp.parse (dt, tzinfos = tzd)' –

+0

từ điển không chính xác ví dụ, MSK trong 2012/12 có bù 4 giờ, nhưng chỉ 3 giờ trong những năm trước – jfs

9

Bạn có thể thử mô-đun pytz: http://pytz.sourceforge.net/

pytz mang lại cơ sở dữ liệu Olson tz vào Python. Thư viện này cho phép chính xác và múi giờ nền tảng chéo tính toán bằng cách sử dụng Python 2.3 hoặc cao hơn. Nó cũng giải quyết vấn đề của thời gian mơ hồ vào cuối ánh sáng ban ngày tiết kiệm, bạn có thể đọc thêm về trong Tham khảo Thư viện Python (datetime.tzinfo).

Amost tất cả các múi giờ Olson được hỗ trợ .

+1

Tôi tò mò, làm thế nào để phân tích cú pháp "Sat, 11/01/09 8:00 PM EST" với pytz đã nói? –

+0

một cách trung thực, nó không thể giải quyết được vì chữ viết tắt không phải là một ngày-một. Tin tốt là pytz đã cung cấp ánh xạ (một-nhiều) và nó còn lại cho các lập trình viên để chọn ánh xạ mong muốn. – Drake

+2

@NasBanov: 'EST' không rõ ràng, nhưng [bạn có thể sử dụng pytz để liệt kê tất cả các cách diễn giải có thể có] (http://stackoverflow.com/a/13713813/4279). – jfs

0

tôi đã sử dụng pytz để tạo ra một bản đồ TZINFOS:

from datetime import datetime as dt 

import pytz 

from dateutil.tz import gettz 
from pytz import utc 
from dateutil import parser 


def gen_tzinfos(): 
    for zone in pytz.common_timezones: 
     try: 
      tzdate = pytz.timezone(zone).localize(dt.utcnow(), is_dst=None) 
     except pytz.NonExistentTimeError: 
      pass 
     else: 
      tzinfo = gettz(zone) 

      if tzinfo: 
       yield tzdate.tzname(), tzinfo 

TZINFOS Cách sử dụng

>>> TZINFOS = dict(gen_tzinfos()) 
>>> TZINFOS 
{'+02': tzfile('/usr/share/zoneinfo/Antarctica/Troll'), 
'+03': tzfile('/usr/share/zoneinfo/Europe/Volgograd'), 
'+04': tzfile('Europe/Ulyanovsk'), 
'+05': tzfile('/usr/share/zoneinfo/Indian/Kerguelen'),    
... 
'WGST': tzfile('/usr/share/zoneinfo/America/Godthab'), 
'WIB': tzfile('/usr/share/zoneinfo/Asia/Pontianak'), 
'WIT': tzfile('/usr/share/zoneinfo/Asia/Jayapura'), 
'WITA': tzfile('/usr/share/zoneinfo/Asia/Makassar'), 
'WSDT': tzfile('/usr/share/zoneinfo/Pacific/Apia'), 
'XJT': tzfile('/usr/share/zoneinfo/Asia/Urumqi')} 

parser Cách sử dụng

>>> date_str = 'Sat, 11/01/09 8:00PM EST' 
>>> tzdate = parser.parse(date_str, tzinfos=TZINFOS) 
>>> tzdate.astimezone(utc) 
datetime.datetime(2009, 11, 2, 1, 0, tzinfo=<UTC>) 

Việc quy đổi tính theo giờ UTC là cần thiết ed vì có nhiều múi giờ có sẵn cho mỗi từ viết tắt. Kể từ TZINFOS là một dict, nó chỉ có múi giờ cuối cùng cho mỗi từ viết tắt. Và bạn có thể không nhận được cái mà bạn mong đợi trước khi chuyển đổi.

>>> tzdate 
datetime.datetime(2009, 11, 1, 20, 0, tzinfo=tzfile('/usr/share/zoneinfo/America/Port-au-Prince')) 
Các vấn đề liên quan