2010-01-28 9 views
5

Ho bisogno di sapere l'ora corrente su CDT quando viene eseguito il mio script Python. Tuttavia, questo script verrà eseguito in più fusi orari diversi, pertanto un offset semplice non funzionerà. Ho solo bisogno di una soluzione per Linux, ma una soluzione multipiattaforma sarebbe l'ideale.come trovare l'ora in un determinato fuso orario da qualsiasi luogo

+0

CDT si riferisce a "Central Daylight Time" – hoju

+0

Si desidera conoscere l'ora in CDT anche quando CDT non è in vigore? –

+0

sì - l'app con cui sto interagendo lo usa. – hoju

risposta

4

È possibile utilizzare time.gmtime() per ottenere l'ora GMT (UTC) da qualsiasi macchina indipendentemente dal fuso orario, quindi è possibile applicare l'offset.

+0

Il problema è sapere quale sia l'offset, quindi questo non aiuta. –

+0

Lennart, no, sta chiedendo come ottenere il tempo in un fuso orario precedentemente noto da qualsiasi altro, per cui 'gmtime()' è la soluzione perfetta .. –

+0

Lo so. Il problema è ancora sapere quali sono gli offset tra i due fusi orari, CDT e l'altro. –

8

pytz o dateutil.tz è il trucco qui. In sostanza si tratta di qualcosa di simile:

>>> from pytz import timezone 
>>> mytz = timezone('Europe/Paris') 
>>> yourtz = timezone('US/Eastern') 

>>> from datetime import datetime 
>>> now = datetime.now(mytz) 
>>> alsonow = now.astimezone(yourtz) 

La difficoltà risiede proprio nel capire quale fuso orario ci si trova in dateutil.tz è meglio a questo..

>>> from dateutil.tz import tzlocal, gettz 
>>> mytz = tzlocal() 
>>> yourtz = gettz('US/Eastern') 

Se si desidera che tutti i minimi dettagli sullo perché fusi orari sono male, sono qui:

http://regebro.wordpress.com/2007/12/18/python-and-time-zones-fighting-the-beast/

http://regebro.wordpress.com/2008/05/10/python-and-time-zones-part-2-the-beast-returns/

http://regebro.wordpress.com/2008/05/13/thanks-for-the-testing-help-conclusions/

+0

+1 per il suggerimento 'pytz'. – jathanism

+0

OP probabilmente ha bisogno solo di: 'datetime.now (pytz.timezone ('US/Central'))'.Il fuso orario locale non ha importanza. – jfs

1

A compensare funzionerà semplice, hai solo bisogno di compensare da UTC.

Usando datetime è possibile ottenere l'UTC (GMT) ora corrente e utilizzare gli oggetti datetime:

datetime.datetime.utcnow() - Fornisce l'ora in UTC

datetime.datetime.now() - Fornisce l'ora in macchina locale

Per ottenere l'ora CT da qualsiasi sistema è necessario conoscere lo sfasamento CT da UTC. Quindi per tenere conto del codice di ora legale una funzione per ottenere l'offset corrente.

>>> import datetime 
>>> utc = datetime.datetime.utcnow() 
>>> current_ct_offset = get_current_ct_offset() 
>>> ct_datetime = utc + datetime.timedelta(hours=current_ct_offset) 

potrei affaccia su qualcosa qui, ma se il tuo unico preoccupati per un fuso orario e il tuo nome movimentazione tz non fare, è piuttosto semplice.

+0

Beh, è ​​preoccupato per due fusi orari. Il locale e CDT. E molto probabilmente, con CDT, in realtà non significa che l'ora legale centrale sia risparmiata senza preoccuparsi dei cambiamenti nell'ora legale, perché sarebbe strano. –

+0

Forse la domanda ha bisogno di ulteriori chiarimenti. La mia comprensione è che vuole "conoscere l'ora corrente in ". In questo caso è necessario conoscere solo l'ora UTC e l'offset dell'utc . In questo caso non è necessario preoccuparsi dell'ora locale. – monkut

+0

Sì. Ma l'unico modo per conoscere in modo affidabile l'offset, se si preoccupa dell'ora legale (e sarebbe stupido non farlo) è usando un database timezone. Quindi, la mia risposta è ancora quella giusta. –

Problemi correlati