linux convert time (per diversi fusi orari) in UTC

C’è un modo, in linux, per ottenere in modo problematico l’ora UTC per una data stringa temporale come

Tue Dec 14 10:30:23 PST 2012 Tue Jan 4 11:30:23 EST 2013 

a un’ora UTC, indipendentemente da (e senza modificare) le impostazioni locali del fuso orario?

date -u -d "Tue Dec 14 10:30:23 PST 2012" rapporti Fri Dec 14 18:30:23 UTC 2012 . La discrepanza è perché il 14 dicembre 2012 è in realtà un venerdì, non un martedì. Probabilmente funziona meglio con un input valido …

Aggiornamento : il risultato con il database tz recente è diverso: EST produce lo stesso offset utc per una determinata data (confrontare con il risultato precedente ). Sebbene ciò non influenzi la conclusione generale secondo cui i diversi fusi orari possono utilizzare la stessa abbreviazione e quindi la stessa abbreviazione può corrispondere a diversi offset dell’utc. Vedi la stringa di data / ora di analisi con il nome abbreviato del fuso orario in Python?


I nomi abbreviati del fuso orario come EST possono essere ambigui.

Esempio

 #!/bin/sh for tz in Australia/Brisbane Australia/Sydney America/New_York do date -u -d"TZ=\":$tz\" Tue Jan 4 11:30:23 EST 2013" done 

Produzione

 Fri Jan 4 16:30:23 UTC 2013 Fri Jan 4 00:30:23 UTC 2013 Fri Jan 4 16:30:23 UTC 2013 

Due cose:

  • la stringa della data può essere interpretata come momentjs diversi nel tempo a seconda del fuso orario utilizzato
  • date ignora silenziosamente il fuso orario Australia/Brisbane che dovrebbe essere UTC+10 , ovvero la date interpreta EST come appartenente a un fuso orario diverso. Senza EST produce tempo corretto:

     $ date -u -d 'TZ=":Australia/Brisbane" Tue Jan 4 11:30:23 2013' Fri Jan 4 01:30:23 UTC 2013 

Per trovare tutti i possibili orari UTC per l’abbreviazione di fuso orario o fuso orario es., Per 'Tue Jan 4 11:30:23 EST 2013' :

 #!/usr/bin/env python from collections import defaultdict from datetime import datetime import pytz # $ sudo apt-get install python-tz # or if you can't install system-wide # $ pip install --user pytz ## Tue Dec 14 10:30:23 PST 2012 #naive_dt, tzname = datetime(2012, 12, 14, 10, 30, 23), 'PST' ## -> Fri Dec 14 18:30:23 2012 UTC # Tue Jan 4 11:30:23 EST 2013 naive_dt, tzname = datetime(2013, 1, 4, 11, 30, 23), 'EST' # Fri Jan 4 01:30:23 2013 UTC # Fri Jan 4 00:30:23 2013 UTC # Fri Jan 4 16:30:23 2013 UTC # ambiguous utc_times = defaultdict(list) for zone in pytz.all_timezones: dt = pytz.timezone(zone).localize(naive_dt, is_dst=None) if dt.tzname() == tzname: # same timezone abbreviation utc_times[dt.astimezone(pytz.utc)].append(zone) for utc_dt, timezones in utc_times.items(): print("%s:\n\t%s" % (utc_dt.strftime('%c %Z'), '\n\t'.join(timezones))) 

Produzione

Tutte le Tue Jan 4 11:30:23 EST 2013 come UTC con i nomi dei fusi orari corrispondenti:

 Fri Jan 4 01:30:23 2013 UTC: Australia/Brisbane Australia/Lindeman Australia/Queensland Fri Jan 4 00:30:23 2013 UTC: Australia/ACT Australia/Canberra Australia/Currie Australia/Hobart Australia/Melbourne Australia/NSW Australia/Sydney Australia/Tasmania Australia/Victoria Fri Jan 4 16:30:23 2013 UTC: America/Atikokan America/Cayman America/Coral_Harbour America/Detroit ... America/New_York ... America/Toronto Canada/Eastern EST EST5EDT Jamaica US/East-Indiana US/Eastern US/Michigan