O formato de hora ISO 8601 não armazena um nome de fuso horário, apenas o deslocamento UTC correspondente é preservado.
Para converter um arquivo ctime em uma sequência de tempo ISO 8601, preservando o deslocamento UTC no Python 3:
>>> import os
>>> from datetime import datetime, timezone
>>> ts = os.path.getctime(some_file)
>>> dt = datetime.fromtimestamp(ts, timezone.utc)
>>> dt.astimezone().isoformat()
'2015-11-27T00:29:06.839600-05:00'
O código pressupõe que o fuso horário local é o Fuso Horário Oriental (ET) e que o sistema fornece um deslocamento UTC correto para o carimbo de data / hora POSIX fornecido (ts
), ou seja, o Python tem acesso a um banco de dados histórico de fuso horário no sistema ou no fuso horário. mesmas regras em uma determinada data.
Se você precisar de uma solução portátil; use o pytz
módulo que fornece acesso ao banco de dados tz :
>>> import os
>>> from datetime import datetime
>>> import pytz # pip install pytz
>>> ts = os.path.getctime(some_file)
>>> dt = datetime.fromtimestamp(ts, pytz.timezone('America/New_York'))
>>> dt.isoformat()
'2015-11-27T00:29:06.839600-05:00'
O resultado é o mesmo neste caso.
Se você precisar do nome / abreviação / ID do fuso horário, armazene-o separadamente.
>>> dt.astimezone().strftime('%Y-%m-%d %H:%M:%S%z (%Z)')
'2015-11-27 00:29:06-0500 (EST)'
Nota: não, :
no deslocamento UTC e na EST
abreviação do fuso horário não faz parte do formato de hora ISO 8601. Não é único.
Bibliotecas diferentes / versões diferentes da mesma biblioteca podem usar regras diferentes de fuso horário para a mesma data / fuso horário. Se for uma data futura, as regras ainda podem ser desconhecidas. Em outras palavras, o mesmo horário UTC pode corresponder a um horário local diferente, dependendo de quais regras você usa - salvar um horário no formato ISO 8601 preserva o horário UTC e o horário local que corresponde às regras de fuso horário atuais em uso na sua plataforma . Pode ser necessário recalcular a hora local em uma plataforma diferente se ela tiver regras diferentes.