Problema de fecha y hora de Python al guardar en la base de datos

En el siguiente código, intento convertir 2 tipos de formatos de fecha en un formato de fecha común para poder almacenarlo en mi base de datos.

import datetime
Date1 = '2012-04-24T12:58:52Z'

Date2 = 'Tue, 24 Apr 2012 12:56:21 -0700'

date1 = Date1.replace("T"," ").replace("Z","")
y = datetime.datetime.strptime(date1,"%Y-%m-%d %H:%M:%S")
date1 = datetime.datetime.strftime(y,"%A, %b %d %Y %H:%M:%S %p")

k = Date2.split(" ")
y = " ".join(k[1:len(k)-1])
date2 = datetime.datetime.strptime(y,"%d %b %Y %H:%M:%S")
date2 = datetime.datetime.strftime(date2,"%A, %b %d %Y %H:%M:%S %p")

print date1
print date2

Me da la siguiente salida.

Tuesday, Apr 24 2012 12:58:52 PM
Tuesday, Apr 24 2012 12:56:21 PM

Pero cuando trato de guardarlo en la base de datos, arroja este error.

Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format

¿Alguien puede ayudarme a resolver este problema? Gracias por adelantado.

preguntado el 03 de mayo de 12 a las 12:05

¿Ha intentado adaptar strftime para que coincida con el formato requerido? -

Hola @moooeeeep, he intentado hacer eso. Pero esta vez, apareció un error diferente. "los datos de tiempo '2012-05-02 19:44:34' no coinciden con el formato '%A, %b %d %Y %H:%M:%S %p'" -

te perdiste la 'T', mira las respuestas a continuación para ver el formato correcto -

4 Respuestas

Muchos DB aceptan datetime.datetime objetos.

import datetime

Date1 = '2012-04-24T12:58:52Z'
dt1 = datetime.datetime.strptime(Date1, '%Y-%m-%dT%H:%M:%SZ')
# dt1: datetime.datetime(2012, 4, 24, 12, 58, 52)

y ahora intente insertar dt1 en DB como un objeto.

contestado el 03 de mayo de 12 a las 12:05

Almacenaría los tiempos como enteros simples, en segundos desde la época (marca de tiempo UNIX). De esta manera, puede almacenarlo en cualquier base de datos sin problemas. El %s especificador de formato para strftime devuelve la marca de tiempo de UNIX como una cadena, por lo que algo similar a

int(datetime.datetime.now().strftime('%s'))

Deberia trabajar. A continuación, puede volver a convertir la marca de tiempo en un datetime objeto usando datetime.datetime.fromtimestamp(…).

contestado el 03 de mayo de 12 a las 12:05

Probablemente tenga una base de datos específica, aunque no lo dijo. Pierde características como postgreSQL current_date y también convierte todos los tiempos a segundos desde la época. - moooeeeeep

Es cierto que el caso de uso define si este enfoque es factible o no. - Igor

Utilice este formato para date1 y date2:

date1 = datetime.datetime.strftime(y,"%Y-%m-%dT%H:%M:%S")
date2 = datetime.datetime.strftime(date2,"%Y-%m-%dT%H:%M:%S")

esto resultará en:

2012-04-24T12:58:52
2012-04-24T12:56:21

el mensaje de error que informa indica claramente que necesita este formato.

contestado el 03 de mayo de 12 a las 12:05

Hola @snies, tengo esta solución antes, pero apareció el siguiente error al insertar en la base de datos "los datos de tiempo '2012-04-24 12:58:52' no coinciden con el formato '%A, %b %d %Y %H :%M:%S %p'" - Chico divertido

Estoy un poco confundido, tal vez editaste tu pregunta, pero creo que tenías una 'T' delimitando la fecha y la hora en la descripción del error original. Asegúrese de lo que dice su error y cómo se ve su cadena de formato. Las diferencias sutiles sí importan. Pero probablemente sea mejor si solo publica la base de datos que está utilizando. - snies

No estoy exactamente seguro de qué objeto está tratando de almacenar en la base de datos. Como sugiere eumiro, muchas bibliotecas le permiten almacenar el objeto de fecha y hora directamente. Pero suponiendo que necesita almacenarlo como una cadena, pero ¿por qué no puede simplemente formatear el objeto de fecha y hora como sugiere el error de la base de datos (YYYY-MM-DD HH: MM: ss)?

Entonces... así:

 import datetime

 Date1 = '2012-04-24T12:58:52Z'
 d1 = datetime.datetime.strptime(Date1,"%Y-%m-%dT%H:%M:%SZ")
 d1.strftime("%Y-%m-%d %H:%M:%S") # Store this!

 Date2 = 'Tue, 24 Apr 2012 12:56:21 -0700'
 k = Date2.split(" ")
 y = " ".join(k[1:len(k)-1])
 d2 = datetime.datetime.strptime(y,"%d %b %Y %H:%M:%S")
 d2.strftime("%Y-%m-%d %H:%M:%S") # Store this!

Esto puede estar fuera del alcance de su pregunta, pero tenga en cuenta que con Date2, está eliminando la información de la zona horaria (-0700). Si eso es importante para usted, debe analizarlo y almacenarlo de alguna manera. Hay una %z en opción strptime que analiza esto, pero desafortunadamente no parece funcionar en todas las plataformas.

contestado el 03 de mayo de 12 a las 12:05

He hecho lo mismo antes también. Me dio este error. "los datos de tiempo '2012-04-24 12:58:52' no coinciden con el formato '%A, %b %d %Y %H:%M:%S %p'" - Chico divertido

Parece que estás usando Django y MySQL. Debería poder simplemente insertar el objeto de fecha y hora directamente, sin convertirlo en una cadena, como sugiere eumiro. ¿Puedes pegar el código donde estableces el atributo de fecha y hora y guardar? - Andrés F.

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.