OrientDB:python 中 SELECT 的日期时间转换问题,服务器和数据库之间的时区不同
OrientDB: DateTime conversion issue on SELECT in python with different timezone between server and db
我的系统及相关设置:
- Linux(在 Ubuntu 和 Debian 中都试过)
- Python 2.7.11
- pyorient 1.4.6a0
- OrientDB 2.1.8
- 工作室 2.1
- 服务器时区"Europe/Rome" (CET/CEST)
- OrientDB 时区"UTC"
由于像 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)
我的系统及相关设置:
- Linux(在 Ubuntu 和 Debian 中都试过)
- Python 2.7.11
- pyorient 1.4.6a0
- OrientDB 2.1.8
- 工作室 2.1
- 服务器时区"Europe/Rome" (CET/CEST)
- OrientDB 时区"UTC"
由于像 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)