2009-11-09 11 views

Odpowiedz

11

To prawdopodobnie nie zadziała, ponieważ skróty te nie są unikatowe. Aby uzyskać szczegółowe informacje, patrz: this page. Możesz skończyć, po prostu ręcznie obsługiwać go samodzielnie, jeśli pracujesz ze znanym zestawem wejść.

+0

Czy jest to łatwiejsze, jeśli ograniczymy je do stref czasowych w USA? Czy istnieje "standardowy" zestaw skrótów w tym zdarzeniu? –

+0

Nie zapominaj, że "strefy czasowe w USA" obejmują AKST, AKDT, HAST i HADT. Jeśli masz na myśli kontynentalną 48 stanów, to masz tylko 8 3-listowych stref czasowych, którymi możesz się zająć (4 strefy czasowe, czas standardowy i letni). – PaulMcG

+0

Wygląda na to, że niektóre miejsca używają HST i HDT jako odpowiedników dla HAST i HADT też = \ –

5

Funkcja parse() w dateutil nie może obsłużyć stref czasowych. Rzeczą, której używam jest formater% Z i funkcja time.strptime(). Nie mam pojęcia, jak radzi sobie z niejednoznacznością w strefach czasowych, ale wydaje się, że odróżnia CDT i CST, co jest wszystkim, czego potrzebowałem.

Tło: Przechowuję obrazy kopii zapasowych w katalogach, których nazwy są sygnaturami czasowymi wykorzystującymi czas lokalny, ponieważ nie mam zegarów GMT przydatnych w domu. Używam time.strptime (d, r "% Y-% m-% dT% H:% M:% S_% Z"), aby przeanalizować nazwy katalogów z powrotem do rzeczywistego czasu analizy wieku.

+0

Jak rozumiem, strptime zajmuje się niejednoznacznością, akceptując tylko czasy podane w bieżącym ustawieniu strefy czasowej. – Random832

55

dateutil jest parser.parse() przyjmuje argumentu jako słowo kluczowe tzinfos słownika rodzaju {'EST': -5*3600} (to jest dopasowanie nazwę strefy, przesunięcie czasowe w sekundach). Więc zakładając, że mamy, możemy zrobić:

>>> 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 

Odnośnie treści tzinfos, oto jak ja zaludnionych Mine:

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. na @Hank Nazewnictwo strefy czasowej gejów nie jest jasno zdefiniowane. Aby utworzyć moją tabelę użyłem http://www.timeanddate.com/library/abbreviations/timezones/ i http://en.wikipedia.org/wiki/List_of_time_zone_abbreviations. Przyjrzałem się każdemu konfliktowi i rozwiązywałem konflikty między niejasnymi i popularnymi nazwiskami w kierunku popularnych (częściej używanych). Był jeden - IST - że nie było tak jednoznaczne (może to oznaczać Indian Standard Time, Iran Standard Time, irlandzki Standard Time lub Israel Standard Time), więc zostawiłem ją z tabela - może być konieczne wybranie tego, co należy dodać w zależności od lokalizacji. Aha - i opuściłem Republikę Kiribati z ich absurdalnym "spojrzeniem na mnie, jestem pierwszy, aby świętować Nowy Rok" GMT + 13 i GMT + 14 stref czasowych.

+3

praktyczne, proste i zadbane! –

+1

Nie mogę pobrać [ChST] (http://en.wikipedia.org/wiki/Chamorro_Time_Zone) do pracy. Ta mała literka ** h ** wydaje się powodować problemy. Musiałem użyć wielkiej litery CHST na liście stref czasowych i zrobić 'dp.parse (dt, tzinfos = tzd)' –

+0

słownik jest niepoprawny, np. MSK w 2012/12 ma przesunięcie 4-godzinne, ale tylko 3 godziny w poprzednich latach – jfs

9

Można spróbować moduł pytz: http://pytz.sourceforge.net/

pytz przynosi bazę danych Olson tz na Pythonie. Biblioteka ta pozwala na dokładne obliczenia strefy czasowej i platformy przy użyciu Pythona 2.3 lub wyżej. Rozwiązuje również problem niejednoznacznych czasów na koniec dnia oszczędności, o których możesz przeczytać więcej na temat w bibliotece Python Reference (datetime.tzinfo).

Amost wszystkie strefy czasowe Olson są obsługiwane .

+1

Jestem ciekawa, jak to parsować "Sob, 11/01/09 20:00 EST" z pytaniem? –

+0

Szczerze mówiąc, nie da się tego rozwiązać, ponieważ skrót nie jest jeden-na-jeden. Dobrą wiadomością jest to, że pytz już dostarczył mapowanie (jeden do wielu) i pozostawia programistom wybór pożądanych mapowań. – Drake

+2

@NasBanov: 'EST' jest niejednoznaczny, ale [można użyć pytz do wyliczenia wszystkich możliwych interpretacji] (http://stackoverflow.com/a/13713813/4279). – jfs

0

kiedyś pytz wygenerować TZINFOS mapowanie:

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 Zastosowanie

>>> 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 Zastosowanie

>>> 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>) 

Konwersja UTC jest konieczność ed, ponieważ dla każdego skrótu dostępnych jest wiele stref czasowych. Od TZINFOS jest dict, ma tylko ostatnią strefę czasową na skrót. I nie możesz dostać tego, którego oczekiwałeś przed konwersją.

>>> tzdate 
datetime.datetime(2009, 11, 1, 20, 0, tzinfo=tzfile('/usr/share/zoneinfo/America/Port-au-Prince')) 
Powiązane problemy