OrientDB:python 中 SELECT 的日期时间转换问题,服务器和数据库之间的时区不同

OrientDB: DateTime conversion issue on SELECT in python with different timezone between server and db

我的系统及相关设置:

由于像 here 所述的日期时间插入问题,我不得不将 OrientDB 时区设置为 "UTC":

ALTER DATABASE TIMEZONE UTC

将服务器时区设置为 "Europe/Rome" 会在对 python 中的日期时间对象执行 SELECT 时产生一些问题。例如:

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

在 Studio 中,命令 returns 我期望的是:

2016-03-22 12:00:00 

而在 python 我有不同的结果:

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

我希望 python 中的结果日期时间与 Studio 中的相同。

您能检查一下您在配置中是否将时区设置为 "Europe/Rome" 吗?

如 pyorient (serializations.py) 中的 here 所述,日期和日期时间使用本地时间进行编码和解码。这会产生几个问题,如 link 和问题中所述。

一个可能的解决方案是更改 serialization.py 以便所有内容都被视为 UTC。

def _encode_value(self, value):

添加

from calendar import timegm

日期时间更改

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

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

更改日期

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

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

def _parse_number(self, content):

更改日期

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

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

日期时间更改

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

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