Datetime to Unix time/epoch in Python 2 / 3

O módulo datetime de Python é frequentemente utilizado no meu trabalho diário, e aqui estão algumas gotchas relacionadas com o fuso horário ao converter uma datatime/epoch Unix, que é o número de segundos que decorreram desde quinta-feira, 1970 Jan 1 00:00:00 UTC.

UTC (Universal Time Coordinated) é útil quando se lida com computadores em diferentes fusos horários. Além disso, alguma hora local varia, por exemplo, a Califórnia usa PDT (Pacific Daylight Time, 7 horas atrás do UTC) no Verão e PST (Pacific Standard Time, 8 horas atrás do UTC) no Inverno.

Take September 13, 2020 12:26:40 UTC por exemplo, convertendo-o para a hora Unix é bastante simples:

$ date --date="Sep 13 12:26:40 UTC 2020" +%s
1600000000$ date -d @1600000000 -u
Sun Sep 13 12:26:40 UTC 2020

Não parece haver uma maneira fácil em Python2 de o fazer. Portanto, ou temos de seguir a definição UTC e fazer algumas contas, ou usar a função strftime() da biblioteca C e ter cuidado com o fuso horário.

# save this code to epoch.py and run with Python 2.7
from datetime import datetime
from dateutil.tz import tzutcdt_2020 = datetime(2020, 9, 13, 12, 26, 40, tzinfo=tzutc())
dt_1970 = datetime(1970, 1, 1, 0, 0, 0, tzinfo=tzutc())
print int((dt_2020 - dt_1970).total_seconds())$ python epoch.py
1600000000

Até agora tudo bem, que tal strftime()?

# save this code to epoch2.py and run with Python 2.7
from datetime import datetime
from dateutil.tz import tzutcdt_2020 = datetime(2020, 9, 13, 12, 26, 40, tzinfo=tzutc())
print dt_2020.strftime('%s')$ python epoch2.py
1600028800$ date -d -@1600028800 -u
Sun Sep 13 20:26:40 UTC 2020

O tempo da época não é correcto porque strftime() depende da variável ambiental TZ.

# Setting environment variable TZ to UTC 
$ TZ=UTC python epoch2.py
1600000000

Com o resultado é correcto. Esta configuração é complicada uma vez que a lógica de conversão pode estar profundamente aninhada dentro de um programa maciço noutro computador, e TZ valor pode ser qualquer coisa. Python 3 fornece uma forma mais limpa.

# save this code to epoch3.py and run with Python 3.4
from datetime import datetime, timezonedt_2020 = datetime(2020, 9, 13, 12, 26, 40, tzinfo=timezone.utc)
print(int(dt_2020.timestamp()))$ python3 epoch3.py
1600000000

Bem, mais uma razão para ir a Python 3 😉

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *