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

2024-05-21 09:06:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我的系统和相关设置:

  • Linux(在Ubuntu和Debian中都尝试过)
  • Python 2.7.11
  • pyorient 1.4.6a0版
  • 定向数据库2.1.8
  • 工作室2.1
  • 服务器时区“欧洲/罗马”(CET/CEST)
  • OrientDB时区“UTC”

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

ALTER DATABASE TIMEZONE UTC

将服务器时区设置为“Europe/Rome”会在python中对datetime对象执行SELECT时产生一些问题。例如:

^{pr2}$

在Studio中,该命令返回我期望的结果:

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中得到的datetime与在Studio中相同。在


Tags: datetimeubuntulinux系统typeresdebianresult
2条回答

正如pyorient中解释的here(序列化.py)日期和日期时间使用本地时间进行编码和解码。这会产生几个问题,如链接中所述,也是问题中描述的问题。在

一个可能的解决办法是改变序列化.py所以一切都被视为UTC。在

def _encode_value(self, value):

添加

^{pr2}$

对于日期时间更改

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)

你能检查一下你的配置是否已经把时区设置为“欧洲/罗马”?在

enter image description here

相关问题 更多 >