如何从Python中的负时代创建日期时间

时间:2013-06-21 07:34:32

标签: python arcpy

StackExchange上的第一个计时器。

我正在使用ArcGIS Server和Python。在尝试使用REST端点执行查询到地图服务时,我在JSON响应中获取esriFieldTypeDate字段的值为负时期。 JSON响应如下所示:

    {
  "feature" :
  {
    "attributes" : {
      "OBJECTID" : 11,
      "BASIN" : "North Atlantic",
      "TRACK_DATE" : -3739996800000,
    }
    ,
    "geometry" :
    {
      "paths" :
      [
        [
          [-99.9999999999999, 30.0000000000001],
          [-100.1, 30.5000000000001]
        ]
      ]
    }
  }
}

我所指的字段是上面JSON中的“TRACK_DATE”。自epoch以来,ArcGIS Server返回的值始终以毫秒为单位。 ArcGIS Server还提供HTML响应,同一查询的TRACK_DATE字段显示为“TRACK_DATE:1851/06/27 00:00:00 UTC”。

所以,日期是在1900年之前,我理解Python内置的datetime模块无法处理1900年之前的日期。我使用的是32位Python v2.6。我正在尝试使用

将其转换为日期时间

datetime.datetime.utcfromtimestamp(float(-3739996800000)/1000)

但是,

失败了
ValueError: timestamp out of range for platform localtime()/gmtime() function

如何在Python 2.6中使用负面和1900年前的epoch?我看过类似的帖子,但找不到解释使用负面时代的帖子。

3 个答案:

答案 0 :(得分:9)

这对我有用:

datetime.datetime(1970, 1, 1) + datetime.timedelta(seconds=(-3739996800000/1000))

datetime.datetime(1851, 6, 27, 0, 0)

这可以在StackOverflow上得到更好的要求,因为它更具有Python特定性,而不是特定于GIS的。

答案 1 :(得分:2)

if timestamp < 0:
    return datetime(1970, 1, 1) + timedelta(seconds=timestamp)
else:
    return datetime.utcfromtimestamp(timestamp)

答案 2 :(得分:0)

您可以使用datetime模块的datetimetimedelta功能完成此操作。

其他答案将时间戳除以1000,将毫秒转换为秒。这是不必要的,因为timedelta函数可以直接作为参数花费毫秒。因此,做这样的事情可能更干净:

datetime.datetime(1970, 1, 1) + datetime.timedelta(milliseconds=-3739996800000)

,正如您所期望的那样提供datetime.datetime(1851, 6, 27, 0, 0)