8

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”。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 年以前的负数时代?我看过类似的帖子,但找不到解释如何处理负面时期的帖子。

4

3 回答 3

12

这对我有用:

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

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

这在 StackOverflow 上会更好,因为它更特定于 Python,而不是特定于 GIS。

于 2013-06-21T08:36:41.090 回答
5
if timestamp < 0:
    return datetime(1970, 1, 1) + timedelta(seconds=timestamp)
else:
    return datetime.utcfromtimestamp(timestamp)
于 2014-03-02T02:20:27.177 回答
1

You can accomplish this using the datetime module's datetime and timedelta functions.

The other answers divide the timestamp by 1000 to convert milliseconds to seconds. This is unnecessary, since the timedelta function can take milliseconds directly as a parameter. It might therefore be cleaner to do something like this:

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

which gives datetime.datetime(1851, 6, 27, 0, 0), as you'd expect.

于 2015-07-16T13:12:19.310 回答