python - from - utc to datetime




Come posso convertire l'ora locale in UTC in Python? (12)

Semplice

L'ho fatto in questo modo:

>>> utc_delta = datetime.utcnow()-datetime.now()
>>> utc_time = datetime(2008, 9, 17, 14, 2, 0) + utc_delta
>>> print(utc_time)
2008-09-17 19:01:59.999996

Fantasia

Se vuoi essere elegante, puoi trasformarlo in un funtore:

class to_utc():
utc_delta = datetime.utcnow() - datetime.now()

def __call__(cls, t):
    return t + cls.utc_delta

Risultato:

>>> utc_converter = to_utc()
>>> print(utc_converter(datetime(2008, 9, 17, 14, 2, 0)))
2008-09-17 19:01:59.999996

Come posso convertire una stringa datetime in ora locale in una stringa in ora UTC ?

Sono sicuro di averlo fatto prima, ma non riesco a trovarlo e SO spero che possa aiutarmi (e altri) a farlo in futuro.

Chiarimento : ad esempio, se ho 2008-09-17 14:02:00 nel fuso orario locale ( +10 ), mi piacerebbe generare una stringa con l'ora UTC equivalente: 2008-09-17 04:02:00 .

Inoltre, da http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ , nota che in generale questo non è possibile come con DST e altri problemi non esiste una conversione univoca dall'ora locale a Ora UTC.


Che ne dite di -

time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))

se secondi è None , converte l'ora locale in ora UTC, quindi converte il tempo passato in UTC.


Grazie a @rofly, la conversione completa da stringa a stringa è la seguente:

time.strftime("%Y-%m-%d %H:%M:%S", 
              time.gmtime(time.mktime(time.strptime("2008-09-17 14:04:00", 
                                                    "%Y-%m-%d %H:%M:%S"))))

Il mio sommario delle funzioni calendar / time :

time.strptime
stringa -> tupla (nessun fuso orario applicato, quindi corrisponde alla stringa)

time.mktime
tupla ora locale -> secondi da epoca (sempre ora locale)

time.gmtime
secondi da epoca -> tupla in UTC

e

calendar.timegm
tupla in UTC -> secondi dall'epoca

time.localtime
secondi da epoca -> tupla nel fuso orario locale


Ho avuto il maggior successo con python-dateutil :

from dateutil import tz

def datetime_to_utc(date):
    """Returns date in UTC w/o tzinfo"""
    return date.astimezone(tz.gettz('UTC')).replace(tzinfo=None) if date.tzinfo else date

Innanzitutto, analizzare la stringa in un oggetto datetime ingenuo. Questa è un'istanza di datetime.datetime senza informazioni sul fuso orario associate. Consultare la documentazione per datetime.strptime per informazioni sull'analisi della stringa della data.

Usa il modulo pytz , che viene fornito con un elenco completo di fusi orari + UTC. Scopri che cos'è il fuso orario locale, costruisci un oggetto del fuso orario e manipolalo e collegalo al datetime ingenuo.

Infine, usa il metodo datetime.astimezone() per convertire il datetime in UTC.

Codice sorgente, utilizzando il fuso orario locale "America / Los_Angeles", per la stringa "2001-2-3 10:11:12":

import pytz, datetime
local = pytz.timezone ("America/Los_Angeles")
naive = datetime.datetime.strptime ("2001-2-3 10:11:12", "%Y-%m-%d %H:%M:%S")
local_dt = local.localize(naive, is_dst=None)
utc_dt = local_dt.astimezone(pytz.utc)

Da lì, è possibile utilizzare il metodo strftime() per formattare il datetime UTC secondo necessità:

utc_dt.strftime ("%Y-%m-%d %H:%M:%S")

La funzione utcnow() del modulo datetime può essere utilizzata per ottenere l'ora UTC corrente.

>>> import datetime
>>> utc_datetime = datetime.datetime.utcnow()
>>> utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2010-02-01 06:59:19'

Come il link citato sopra da Tom: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ dice:

UTC è un fuso orario senza l'ora legale e ancora un fuso orario senza modifiche di configurazione nel passato.

Misurare e memorizzare sempre il tempo in UTC .

Se è necessario registrare dove è stata presa l'ora, conservarla separatamente. Non memorizzare l'ora locale + le informazioni sul fuso orario!

NOTA : se uno dei tuoi dati si trova in una regione che utilizza l'ora legale, usa pytz e dai un'occhiata alla risposta di John Millikin.

Se si desidera ottenere l'ora UTC da una determinata stringa e avere la fortuna di trovarsi in una regione del mondo che non utilizza l'ora legale o si dispone di dati che sono solo sfalsati da UTC senza applicare l'ora legale:

-> utilizzando l'ora locale come base per il valore di offset:

>>> # Obtain the UTC Offset for the current system:
>>> UTC_OFFSET_TIMEDELTA = datetime.datetime.utcnow() - datetime.datetime.now()
>>> local_datetime = datetime.datetime.strptime("2008-09-17 14:04:00", "%Y-%m-%d %H:%M:%S")
>>> result_utc_datetime = local_datetime + UTC_OFFSET_TIMEDELTA
>>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2008-09-17 04:04:00'

-> Oppure, da un offset noto, usando datetime.timedelta ():

>>> UTC_OFFSET = 10
>>> result_utc_datetime = local_datetime - datetime.timedelta(hours=UTC_OFFSET)
>>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2008-09-17 04:04:00'

Puoi farlo con:

>>> from time import strftime, gmtime, localtime
>>> strftime('%H:%M:%S', gmtime()) #UTC time
>>> strftime('%H:%M:%S', localtime()) # localtime

Sto avendo fortuna con dateutil (che è ampiamente raccomandato su SO per altre domande correlate):

from datetime import *
from dateutil import *
from dateutil.tz import *

# METHOD 1: Hardcode zones:
utc_zone = tz.gettz('UTC')
local_zone = tz.gettz('America/Chicago')
# METHOD 2: Auto-detect zones:
utc_zone = tz.tzutc()
local_zone = tz.tzlocal()

# Convert time string to datetime
local_time = datetime.strptime("2008-09-17 14:02:00", '%Y-%m-%d %H:%M:%S')

# Tell the datetime object that it's in local time zone since 
# datetime objects are 'naive' by default
local_time = local_time.replace(tzinfo=local_zone)
# Convert time to UTC
utc_time = local_time.astimezone(utc_zone)
# Generate UTC time string
utc_string = utc_time.strftime('%Y-%m-%d %H:%M:%S')

(Il codice è stato ricavato da questa risposta per convertire la stringa datetime UTC in datetime locale )


Utilizzando http://crsmithdev.com/arrow/

arrowObj = arrow.Arrow.strptime('2017-02-20 10:00:00', '%Y-%m-%d %H:%M:%S' , 'US/Eastern')

arrowObj.to('UTC') or arrowObj.to('local') 

Questa libreria semplifica la vita :)


in questo caso ... pytz è la migliore lib

import pytz
utc = pytz.utc
yourdate = datetime.datetime.now()
yourdateutc = yourdate.astimezone(utc).replace(tzinfo=None)


import time

import datetime

def Local2UTC(LocalTime):

    EpochSecond = time.mktime(LocalTime.timetuple())
    utcTime = datetime.datetime.utcfromtimestamp(EpochSecond)

    return utcTime

>>> LocalTime = datetime.datetime.now()

>>> UTCTime = Local2UTC(LocalTime)

>>> LocalTime.ctime()

'Thu Feb  3 22:33:46 2011'

>>> UTCTime.ctime()

'Fri Feb  4 05:33:46 2011'




utc