example create python datetime

create - string to datetime python



¿Por qué datetime.datetime.utcnow() no contiene información de la zona horaria? (8)

datetime.datetime.utcnow()

¿Por qué esta datetime no tiene ninguna información de zona horaria dado que es explícitamente una datetime UTC?

Espero que esto contenga tzinfo .


El módulo pytz es una opción, y existe otro python-dateutil , que aunque también es un paquete de terceros, puede que ya esté disponible dependiendo de sus otras dependencias y sistema operativo.

Solo quería incluir esta metodología como referencia: si ya ha instalado python-dateutil para otros propósitos, puede usar su tzinfo lugar de duplicarlo con pytz

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())

utcnow a aceptar que las llamadas a utcnow deben incluir la información de la zona horaria UTC. Sospecho que esto no está incluido porque la biblioteca nativa de fecha y hora se establece de manera predeterminada en tiempos de datos ingenuos para compatibilidad cruzada.


Eso significa que es ingenuo para la zona horaria, por lo que no puede usarlo con datetime.astimezone

Puedes darle una zona horaria como esta

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

ahora puedes cambiar las zonas horarias

print(u.astimezone(pytz.timezone("America/New_York")))

Para obtener la hora actual en una zona horaria determinada, puede pasar tzinfo a datetime.now() directamente:

#!/usr/bin/env python from datetime import datetime import pytz # $ pip install pytz print(datetime.now(pytz.timezone("America/New_York")))

Funciona para cualquier zona horaria, incluidos los que observan el horario de verano (DST), es decir, funciona para zonas horarias que pueden tener diferentes desplazamientos de utc en diferentes momentos (desplazamiento de utc no fijo). No utilice tz.localize(datetime.now()) : puede fallar durante la transición de final del horario de verano cuando la hora local es ambigua.


Julien Danjou escribió un buen artículo que explica por qué nunca debes lidiar con las zonas horarias . Un experto:

De hecho, la API de Python datetime siempre devuelve objetos de datetime que no son conscientes, lo que es muy desafortunado. De hecho, tan pronto como obtienes uno de este objeto, no hay forma de saber qué es la zona horaria, por lo tanto, estos objetos son bastante "inútiles" por sí solos.

Lamentablemente, aunque puedes usar utcnow() , aún no verás la información de la zona horaria, como descubriste.

Recomendaciones:

  • Utilice siempre objetos de datetime conscientes, es decir, con información de zona horaria. Eso asegura que pueda compararlos directamente (los objetos de datetime y datetime conscientes y no conscientes no son comparables) y los devolverá correctamente a los usuarios. Aproveche pytz para tener objetos de zona horaria.

  • Utilice ISO 8601 como el formato de cadena de entrada y salida. Use datetime.datetime.isoformat() para devolver marcas de tiempo como cadenas formateadas usando ese formato, que incluye la información de la zona horaria.

  • Si necesita analizar cadenas que contengan marcas de tiempo con formato ISO 8601, puede confiar en iso8601 , que devuelve las marcas de tiempo con la información de zona horaria correcta. Esto hace que las marcas de tiempo sean directamente comparables.


Las bibliotecas estándar de Python no incluyen ninguna clase tzinfo (pero ver pep 431 ). Solo puedo adivinar las razones. Personalmente, creo que fue un error no incluir una clase tzinfo para UTC, porque esa no es lo suficientemente controvertida como para tener una implementación estándar.

Edición: Aunque no hay implementación en la biblioteca, hay una como ejemplo en la documentación de tzinfo .

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 usarlo, para obtener la hora actual como un objeto datetime consciente:

from datetime import datetime now = datetime.now(utc)

Hay datetime.timezone.utc en Python 3.2+:

from datetime import datetime, timezone now = datetime.now(timezone.utc)


Las fechas UTC no necesitan ninguna información de la zona horaria, ya que son UTC, lo que por definición significa que no tienen compensación.


Para agregar información de timezone en Python 3.2+

import datetime >>> d = datetime.datetime.now(tz=datetime.timezone.utc) >>> print(d.tzinfo) ''UTC+00:00''


Tenga en cuenta que para Python 3.2 en adelante, el módulo datetime.timezone contiene datetime.timezone . La documentación para datetime.utcnow() dice:

Se puede obtener un datetime UTC actual al llamar a datetime.now ( timezone.utc ) .

Así que puedes hacer:

>>> import datetime >>> datetime.datetime.now(datetime.timezone.utc) datetime.datetime(2014, 7, 10, 2, 43, 55, 230107, tzinfo=datetime.timezone.utc)


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]