datetime.datetime.utcnow()
Por que isso datetime
não possui nenhuma informação de fuso horário, pois é explicitamente um UTC datetime
?
Eu esperaria que isso contivesse tzinfo
.
datetime.datetime.utcnow()
Por que isso datetime
não possui nenhuma informação de fuso horário, pois é explicitamente um UTC datetime
?
Eu esperaria que isso contivesse tzinfo
.
Respostas:
Isso significa que é um fuso horário ingênuo, então você não pode usá-lo com datetime.astimezone
você pode atribuir um fuso horário como este
import pytz # 3rd party: $ pip install pytz
u = datetime.utcnow()
u = u.replace(tzinfo=pytz.utc) #NOTE: it works only with a fixed utc offset
agora você pode mudar de fuso horário
print(u.astimezone(pytz.timezone("America/New_York")))
Para obter a hora atual em um determinado fuso horário, você pode passar o tzinfo para datetime.now()
diretamente:
#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
print(datetime.now(pytz.timezone("America/New_York")))
Funciona para qualquer fuso horário, incluindo aqueles que observam o horário de verão (DST), ou seja, funciona para fusos horários que podem ter diferentes desvios de utc em momentos diferentes (deslocamento de utc não fixo). Não use tz.localize(datetime.now())
- pode falhar durante a transição no final do horário de verão quando a hora local é ambígua.
astimezone
. Portanto, datetime não apenas não possui fusos horários nativos, mas a única implementação amplamente disponível do tzinfo não é compatível com o suposto padrão.
u=datetime.now(pytz.utc)
tz.localize(datetime.now())
; use em datetime.now(tz)
vez disso.
Observe que, para o Python 3.2 em diante, o datetime
módulo contém datetime.timezone
. A documentação para datetime.utcnow()
diz:
Um datetime UTC atual consciente pode ser obtido chamando .
datetime.now
(
timezone.utc
)
Então você pode fazer:
>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2014, 7, 10, 2, 43, 55, 230107, tzinfo=datetime.timezone.utc)
datetime.now(timezone.utc)
ou datetime.utcnow(timezone.utc)
?
datetime.utcnow()
não aceita argumentos. Então teria que ser datetime.now(timezone.utc)
.
datetime.now()
retornará a hora da máquina, mas datetime.utcnow()
retornará a hora UTC real.
datetime.utcnow()
não definido tzinfo
para indicar que é UTC. Mas datetime.now(datetime.timezone.utc)
retorna a hora UTC com tzinfo
set.
tz
objeto no construtor now, ele retornará o tempo desse fuso horário? Está bem! Obrigado por apontar.
As bibliotecas padrão do Python não incluem nenhuma classe tzinfo (mas consulte pep 431 ). Só posso adivinhar as razões. Pessoalmente, acho que foi um erro não incluir uma classe tzinfo para o UTC, porque essa é incontroversa o suficiente para ter uma implementação padrão.
Editar: Embora não exista implementação na biblioteca, existe um exemplo na tzinfo
documentação .
from datetime import timedelta, tzinfo
ZERO = timedelta(0)
# A UTC class.
class UTC(tzinfo):
"""UTC"""
def utcoffset(self, dt):
return ZERO
def tzname(self, dt):
return "UTC"
def dst(self, dt):
return ZERO
utc = UTC()
Para usá-lo, para obter o horário atual como um objeto de data e hora consciente:
from datetime import datetime
now = datetime.now(utc)
Existe datetime.timezone.utc
no Python 3.2+:
from datetime import datetime, timezone
now = datetime.now(timezone.utc)
datetime
objetos criados por utcnow()
) ...
timezone.utc
foi finalmente adicionado ao Python 3.2. Para compatibilidade com versões anteriores, utcnow()
ainda retorna um objeto de tempo sem fuso horário, mas você pode obter o que deseja chamando now(timezone.utc)
.
struct
módulo faria conversões automáticas de Unicode para bytestring e a decisão final foi quebrar a compatibilidade com versões anteriores do Python 3 para impedir que uma decisão ruim seguisse adiante.
tzinfo
documentação do Python inclua exemplos de código para implementá-lo, mas eles não incluem essa funcionalidade no próprio datetime! docs.python.org/2/library/datetime.html#datetime.tzinfo.fromutc
pytz
é um ótimo recurso. No momento em que editei minha resposta para inserir o código de exemplo, alguém já havia sugerido e eu não queria roubar seus trovões.
O pytz
módulo é uma opção e existe outra python-dateutil
, que, embora também seja um pacote de terceiros, pode já estar disponível dependendo de suas outras dependências e sistema operacional.
Eu só queria incluir essa metodologia para referência - se você já instalou python-dateutil
para outros fins, pode usá-la em tzinfo
vez de duplicar compytz
import datetime
import dateutil.tz
# Get the UTC time with datetime.now:
utcdt = datetime.datetime.now(dateutil.tz.tzutc())
# Get the UTC time with datetime.utcnow:
utcdt = datetime.datetime.utcnow()
utcdt = utcdt.replace(tzinfo=dateutil.tz.tzutc())
# For fun- get the local time
localdt = datetime.datetime.now(dateutil.tz.tzlocal())
Costumo concordar que as chamadas para utcnow
devem incluir as informações do fuso horário UTC. Suspeito que isso não esteja incluído porque a biblioteca de data / hora nativa é padronizada como data / hora ingênua para compatibilidade cruzada.
utcdt = datetime.datetime.utcfromtimestamp(1234567890).replace(dateutil.tz.tzutc())
datetime.now(pytz_tz)
que sempre funciona; datetime.now(dateutil.tz.tzlocal())
pode falhar durante transições de horário de verão . PEP 495 - A desambiguação na hora local pode melhorar a dateutil
situação no futuro.
utc_dt = datetime.fromtimestamp(1234567890, dateutil.tz.tzutc())
(nota: dateutil
com um deslocamento utc não fixo (como dateutil.tz.tzlocal()
) pode falhar aqui , use uma pytz
solução baseada em vez ).
dateutil
para dateutil.parser
, eu gostei esta solução melhor. Era tão simples como: utcCurrentTime = datetime.datetime.now(tz=dateutil.tz.tzutc())
. Viola!!
Julien Danjou escreveu um bom artigo explicando por que você nunca deve lidar com fusos horários . Um trecho:
De fato, a API de data e hora do Python sempre retorna objetos de data e hora desconhecidos, o que é muito lamentável. De fato, assim que você obtém um desses objetos, não há como saber qual é o fuso horário; portanto, esses objetos são "inúteis" por si próprios.
Infelizmente, mesmo que você possa usá- utcnow()
lo, ainda não verá as informações do fuso horário, como descobriu.
Recomendações:
Sempre use
datetime
objetos conscientes , ou seja, com informações de fuso horário. Isso garante que você possa compará-los diretamente (datetime
objetos conscientes e inconscientes não são comparáveis) e os retornará corretamente aos usuários. Aproveite o pytz para ter objetos de fuso horário.Use ISO 8601 como formato de sequência de entrada e saída. Use
datetime.datetime.isoformat()
para retornar os carimbos de data e hora como string formatada usando esse formato, que inclui as informações do fuso horário.Se você precisar analisar seqüências de caracteres contendo carimbos de data e hora no formato ISO 8601, poderá confiar nele
iso8601
, que retornará carimbos de data e hora com informações corretas do fuso horário. Isso torna os timestamps diretamente comparáveis.
Para adicionar timezone
informações no Python 3.2 ou superior
import datetime
>>> d = datetime.datetime.now(tz=datetime.timezone.utc)
>>> print(d.tzinfo)
'UTC+00:00'
AttributeError: 'module' object has no attribute 'timezone'
Python 2.7.13 (padrão, 19 de janeiro de 2017, 14:48:08)
from datetime import datetime
from dateutil.relativedelta import relativedelta
d = datetime.now()
date = datetime.isoformat(d).split('.')[0]
d_month = datetime.today() + relativedelta(months=1)
next_month = datetime.isoformat(d_month).split('.')[0]
As datas UTC não precisam de nenhuma informação de fuso horário, pois são UTC, o que, por definição, significa que elas não têm deslocamento.
pytz.utc
). Observe que há uma grande diferença entre um valor cujo deslocamento em relação ao UTC é desconhecido e um em que se sabe que é 0. O último é o que utcnow()
deve retornar, IMO. Isso se encaixaria com "Um objeto consciente é usado para representar um momento específico no tempo que não está aberto à interpretação", conforme a documentação.