2012-10-06 4 views
6

Ecco cosa sto cercando di fare: l'utente invia un tempo in pacifico, una volta inviato utilizzo .replace per impostare il fuso orario su Pacific.Perché la appengine non converte automaticamente datetime in UTC quando si chiama put()

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

Una volta impostato lo tzinfo, sto facendo un tentativo. Secondo la documentazione pitone di Google AppEngine che 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."

Tuttavia, quando faccio una put(), ottengo il seguente errore:

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

Si prega di notare che sto usando NDB

Ok, quindi, dopo averlo fatto, ho pensato che forse NDB non lo convertisse automaticamente in UTC. Allora ho provato a convertirlo in UTC utilizzando il seguente codice:

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

e ora ho ancora lo stesso errore anche dopo converto il tempo Pacifico per UTC e impostare il nome tzinfo come "UTC".

Potrebbe davvero usare un sacco di aiuto qui ... grazie!

risposta

13

La soluzione è quella di rimuovere completamente il tzinfo dal momento in cui si effettua la conversione in UTC.

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

ah così semplice! Grazie! – iceanfire

+3

in realtà un esempio sarebbe stato davvero utile. – Houman

+0

Ecco un esempio: do timestamp = timestamp.replace (tzinfo = None) prima di impostare la proprietà su timestamp. – Luca

0

Ecco il mio esempio di lavoro:

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

Forse cambierà se la dichiarazione a : se my_date.utcoffset() non è None: – MrJ

0

mi sono imbattuto in questo utilizzando http://hnrss.org/. Questa era la mia soluzione.

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) 

Ora tentare la put() e si dovrebbe vedere 2016/10/24 16:49:47 nel datastore Cloud.

Problemi correlati