2012-10-06 34 views
6

Esto es lo que estoy tratando de hacer: el usuario envía una hora en pacific, una vez enviado utilizo .replace para establecer la zona horaria en Pacific.¿Por qué no appeagine auto-convertir datetime a UTC al llamar a put()

Pacific = time.USTimeZone(-8, "Pacific", "PST", "PDT") 
addEvent.date = addEvent.date.replace(tzinfo=Pacific) 

Una vez que haya configurado el tzinfo, lo haré. De acuerdo con la documentación pitón de google appengine que dice:

"If the datetime value has a tzinfo attribute, it will be converted to the UTC time zone for storage. Values come back from the datastore as UTC, with a tzinfo of None. An application that needs date and time values to be in a particular time zone must set tzinfo correctly when updating the value, and convert values to the timezone when accessing the value."

Sin embargo, cuando hago un put(), me sale el siguiente error:

WARNING 2012-10-06 21:10:14,579 tasklets.py:399] initial generator _put_tasklet(context.py:264) raised NotImplementedError(DatetimeProperty date can only support UTC. Please derive a new Property to support alternative timezones.) WARNING 2012-10-06 21:10:14,579 tasklets.py:399] suspended generator put(context.py:703) raised NotImplementedError(DatetimeProperty date can only support UTC. Please derive a new Property to support alternative timezones.)

Tenga en cuenta que estoy usando NDB

Ok, entonces después de hacer eso asumí que quizás NDB no lo convierta automáticamente en UTC. Así Luego trató de convertirlo a UTC usando el siguiente código:

class UTC(tzinfo): 
    def utcoffset(self, dt): 
    return timedelta(0) 
    def tzname(self, dt): 
    return str("UTC") 
    def dst(self, dt): 
    return timedelta(0) 

y ahora sigo teniendo el mismo error incluso después de que convierte la hora del pacífico a la hora UTC y establecer el nombre tzinfo como "UTC".

Realmente podría necesitar un montón de ayuda aquí ... gracias!

Respuesta

13

La solución es eliminar por completo el tzinfo después de convertir a UTC.

timestamp = timestamp.replace(tzinfo=None) 
+0

ah tan simple! ¡Gracias! – iceanfire

+3

realmente un ejemplo habría sido realmente útil. – Houman

+0

Aquí hay un ejemplo: do timestamp = timestamp.replace (tzinfo = None) antes de establecer la Propiedad en timestamp. – Luca

0

Aquí mi ejemplo de trabajo:

if my_date.utcoffset(): 
    my_date = (my_date - my_date.utcoffset()).replace(tzinfo=None) 
+0

Quizás cambie la instrucción if en : if my_date.utcoffset() no es None: – MrJ

0

me encontré con esto usando http://hnrss.org/. Esta fue mi solución.

import datetime 
    from dateutil import parser 

    your_date_string = 'Mon, 24 Oct 2016 16:49:47 +0000' 

    your_date = parser.parse('your_date_string') 
    # your_date is now a datetime.datetime object 

    your_date_minus_tz = your_date.replace(tzinfo=None) 

Ahora probar su put() y debería ver 24/10/2016 16:49:47 en el almacén de datos de la nube.

Cuestiones relacionadas