2016-03-30 14 views
1

My System und Einstellungen vor:Orientdb: Datetime-Konvertierung Problem auf SELECT in Python mit anderer Zeitzone zwischen Server und db

  • Linux (versucht, beide in Ubuntu und Debian)
  • Python 2.7.11
  • pyorient 1.4.6a0
  • Orientdb 2.1.8
  • Studio 2.1
  • Server Zeitzone "Europa/Rom" (MEZ/MESZ)
  • Orientdb Zeitzone „UTC“

Aufgrund Datetime Einfügen Probleme wie die beschriebenen here ich die Orientdb Zeitzone „UTC“ gesetzt hatte:

ALTER DATABASE TIMEZONE UTC 

Mit der Server-Zeitzone auf „Europa gesetzt/Rom "erzeugt einige Probleme beim Ausführen von SELECT für ein Datetime-Objekt in Python. Zum Beispiel:

select distinct(tstamp_ini) as ini from Fct order by ini desc limit 1 

in Studio gibt den Befehl, was ich erwarte:

2016-03-22 12:00:00 

während in Python habe ich ein anderes Ergebnis:

print result[0] 
{{'ini': datetime.datetime(2016, 3, 22, 13, 0)},'version':0,'rid':'#-2:139359'} 

res=result[0].ini 
print res 
2016-03-22 13:00:00 
print type(res) 
<type 'datetime.datetime'> 
print res.tzinfo 
None 

Ich mag die resultierende Datetime Sei in Python genauso wie in Studio.

Antwort

1

Wie erläutert here in pyorient (serializations.py) Daten und Datetimes codiert und decodiert lokale Zeit verwenden. Dies erzeugt mehrere Probleme, wie in der Verbindung beschrieben und auch in der Frage beschrieben.

Eine mögliche Lösung besteht darin, serialization.py zu ändern, sodass alles als UTC behandelt wird.

In

def _encode_value(self, value): 

hinzufügen

from calendar import timegm 

für Datetime-Änderung

elif isinstance(value, datetime): 
    ret = str(int(time.mktime(value.timetuple())) * 1000) + 't' 

zu

elif isinstance(value, datetime): 
    ret = str(int(timegm(value.timetuple())) * 1000) + 't' 

für Datum

Änderung
elif isinstance(value, date): 
    ret = str(int(time.mktime(value.timetuple())) * 1000) + 'a' 

zu

elif isinstance(value, date): 
    ret = str(int(timegm(value.timetuple())) * 1000) + 'a' 

in

def _parse_number(self, content): 

für Datumswechsel

if c == 'a': 
    collected = date.fromtimestamp(float(collected)/1000) 

zu

if c == 'a': 
    collected = datetime.utcfromtimestamp(float(collected)/1000).date() 

für Datetime-Änderung

elif c == 't': 
    collected = datetime.fromtimestamp(float(collected)/1000) 

zu

elif c == 't': 
    collected = datetime.utcfromtimestamp(float(collected)/1000) 
0

Können Sie überprüfen, ob Sie in Ihrer Konfiguration die Zeitzone auf "Europa/Rom" eingestellt haben?

enter image description here

+0

Die DB Zeitzone ist GMT, aber ich brauche es in GMT. Das Problem wird durch die Tatsache verursacht, dass der Server und die DB-Zeitzone unterschiedlich sind, aber es erscheint nur in Python und nicht in Studio. – fzwaard