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)

これは、GIS 固有というよりも Python 固有であるため、StackOverflow で尋ねたほうがよいでしょう。

于 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

datetimeこれは、モジュールのdatetimeおよびtimedelta関数を使用して実現できます。

他の回答では、タイムスタンプを 1000 で割り、ミリ秒を秒に変換しています。timedelta関数はミリ秒をパラメーターとして直接受け取ることができるため、これは不要です。したがって、次のようなことを行う方がクリーンな場合があります。

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

datetime.datetime(1851, 6, 27, 0, 0)あなたが期待するように、これは を与えます。

于 2015-07-16T13:12:19.310 に答える