Cómo agregar una zona horaria en una instancia de fecha y hora ingenua en python

Tengo una datetime y datetime que no tiene información de zona horaria. Ahora estoy obteniendo la información de la zona horaria y me gustaría agregar la zona horaria a la instancia de fecha y hora existente, ¿cómo puedo hacerlo?

 d = datetime.datetime.now() tz = pytz.timezone('Asia/Taipei') 

Cómo agregar la información de zona horaria tz en datetime a

Utilice tz.localize(d) para localizar la instancia. De la documentación :

El primero es usar el método localize () provisto por la biblioteca pytz. Esto se utiliza para localizar un datetime ingenuo (datetime sin información de zona horaria):

 >>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0)) >>> print(loc_dt.strftime(fmt)) 2002-10-27 06:00:00 EST-0500 

Si no usa tz.localize() , pero usa datetime.replace() , lo más probable es que se use un desplazamiento histórico ; tz.localize() seleccionará el desplazamiento correcto en efecto para la fecha dada. Las fechas de inicio y finalización del horario de verano en la zona este de EE. UU. Han cambiado con el tiempo, por ejemplo.

Cuando intenta localizar un valor de fecha y hora que es ambiguo porque abarca el período de transición de verano a invierno o viceversa, se consultará la zona horaria para ver si el objeto de fecha y hora resultante debe tener .dst() devuelva Verdadero o Falso. Puede anular el valor predeterminado para la zona horaria con el argumento de palabra clave .localize() para .localize() :

 dt = tz.localize(naive, is_dst=True) 

o incluso desactive la opción por completo configurando is_dst=None . En ese caso, o en los casos raros, no hay un conjunto predeterminado para una zona horaria, un valor de fecha y hora ambiguo daría lugar a una excepción AmbiguousTimeError . El indicador is_dst solo se consulta para los valores de fecha y hora que son ambiguos y, de lo contrario, se ignoran.

Para volver por el otro lado, gire un objeto que tenga en cuenta la zona horaria a un objeto ingenuo, use .replace(tzinfo=None) :

 naivedt = awaredt.replace(tzinfo=None) 

Si sabe que su fecha y hora original se “midió” en la zona horaria que está intentando agregarle, podría (pero probablemente no debería) usar replace lugar de localize .

 # d = datetime.datetime.now() # tz = pytz.timezone('Asia/Taipei') d = d.replace(tzinfo=tz) 

Puedo imaginar 2 veces cuando esto podría tener sentido (la segunda me sucedió):

  1. La configuración regional de su servidor está configurada en la zona horaria incorrecta y usted está tratando de corregir una instancia de datetime al avisarle de esta zona horaria incorrecta (y presumiblemente más tarde, ubicarla en la zona horaria “correcta” para que los valores de now () coincidan con otras veces lo estás comparando con (tu reloj, quizás)
  2. Desea “etiquetar” una instancia de time ( NO una datetime y datetime ) con un atributo de zona horaria (tzinfo) para que ese atributo se pueda usar más adelante para formar una instancia de datetime completa.