2013-06-21 11 views
5

Pierwszy timer na StackExchange.jak utworzyć datę i godzinę z negatywnej epoki w Pythonie

Pracuję z ArcGIS Server i Python. Podczas próby wykonania kwerendy przy użyciu punktu końcowego usługi REST do usługi map, otrzymuję wartości dla pola, które jest esriFieldTypeDate w negatywnej epoce w odpowiedzi JSON. Odpowiedź JSON wygląda następująco:

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

Pole Mam na myśli to „TRACK_DATE” w powyższym JSON. Wartości zwracane przez ArcGIS Server są zawsze w milisekundach od epoki. Serwer ArcGIS dostarcza również odpowiedź HTML, a pole TRACK_DATE dla tego samego zapytania jest wyświetlane jako "TRACK_DATE: 1851/06/27 00:00:00 UTC".

Tak, data jest przed 1900 i rozumiem, że wbudowany moduł datetime w Pythonie nie jest w stanie obsłużyć dat sprzed 1900 roku. Używam 32-bitowego Pythona v2.6. Próbuję przekonwertować je do datetime przy użyciu

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

Jednak to nie z

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

Jak jeden utwór z epoki, które są negatywne i pre 1900 w Pythonie 2.6? Przyjrzałem się podobnym postom, ale nie mogłem znaleźć takiego, który tłumaczyłby pracę z negatywnymi epokami.

Odpowiedz

6

Działa to dla mnie:

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

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

To byłby lepszy zadawane na StackOverflow, ponieważ jest bardziej specyficzna niż Python GIS jest specyficzny.

+0

To działa również dla mnie !! Dziękuję bardzo Jason. – Anand

1

nie mogę się wypowiedzieć, ponieważ nie mam jeszcze 50 reputacji ...

chodzi o odpowiedź Jason Scheirer, a nie powinno być:

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

?

Jest od:

>>> import datetime 
>>> datetime.datetime.fromtimestamp(0) 
datetime.datetime(1970, 1, 1, 2, 0) 
+1

Właściwie nie, ponieważ jest to zależne od strefy czasowej. 'datetime.datetime.utcfromtimestamp (0)' jest poprawne. – JBernardo

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

Można tego dokonać za pomocą modułu datetimedatetime i timedelta funkcje.

Pozostałe odpowiedzi dzielą znacznik czasu przez 1000, aby przekonwertować milisekundy na sekundy. Nie jest to konieczne, ponieważ funkcja timedelta może zająć milisekundy bezpośrednio jako parametr. Może zatem być czystsze zrobić coś takiego:

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

co daje datetime.datetime(1851, 6, 27, 0, 0), jak można się spodziewać.

Powiązane problemy