2009-10-20 34 views
11
//parses some string into that format. 
datetime1 = datetime.strptime(somestring, "%Y-%m-%dT%H:%M:%S") 

//gets the seconds from the above date. 
timestamp1 = time.mktime(datetime1.timetuple()) 

//adds milliseconds to the above seconds. 
timeInMillis = int(timestamp1) * 1000 

Jak (w którymkolwiek momencie tego kodu) zmienić datę na format UTC? Przeszukałem API przez to, co wydaje mi się stuleciem i nie mogę znaleźć niczego, co mógłbym uzyskać. Czy ktoś może pomóc? Obecnie uważam, że jest to czas wschodni (jednak jestem w GMT, ale chcę UTC).Konwertuj na znacznik czasu UTC

EDYCJA: Podałem odpowiedź facetowi, który jest najbliżej tego, co w końcu odkryłem.

datetime1 = datetime.strptime(somestring, someformat) 
timeInSeconds = calendar.timegm(datetime1.utctimetuple()) 
timeInMillis = timeInSeconds * 1000 

:)

+0

Czy możesz określić strefę czasową 'somestring' w? Czy to UTC czy lokalna strefa czasowa? 'timegm (datetime1.utctimetuple())' nie zadziała, jeśli 'datetime1' nie jest już w UTC. 'utctimetuple()' does * not * przekonwertuje go na UTC, chyba że podany jest świadomy obiekt datetime. – jfs

Odpowiedz

2
def getDateAndTime(seconds=None): 
""" 
    Converts seconds since the Epoch to a time tuple expressing UTC. 
    When 'seconds' is not passed in, convert the current time instead. 
    :Parameters: 
     - `seconds`: time in seconds from the epoch. 
    :Return: 
     Time in UTC format. 
""" 
return time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))` 

ten przekształca czasu lokalnego na UTC

time.mktime(time.localtime(calendar.timegm(utc_time))) 

http://feihonghsu.blogspot.com/2008/02/converting-from-local-time-to-utc.html

Jeśli przekształcenie struct_time do sekundy-Since-the-epoki odbywa się za pomocą mktime, to konwersji jest w lokalnej strefie czasowej. Nie ma sposobu, aby powiedzieć, aby użyć konkretnej strefy czasowej, nawet nie tylko UTC. Standardowy pakiet "czas" zawsze zakłada, że ​​czas jest w lokalnej strefie czasowej.

+0

-1: 'getDateAndTime()' jest niepowiązane (akceptuje 'sekundy ', że pytanie pyta, jak dostać się na pierwszym miejscu) i jest zepsute: implementacja nie odpowiada jego docstringowi. Jeśli masz 'utc_time', wystarczy wywołać' calendar.timegm() '(zarówno czas lokalny, mktime są niepotrzebne i mogą powodować błędne wyniki). – jfs

8

datetime.utcfromtimestamp jest chyba to, czego szukasz:

>>> timestamp1 = time.mktime(datetime.now().timetuple()) 
>>> timestamp1 
1256049553.0 
>>> datetime.utcfromtimestamp(timestamp1) 
datetime.datetime(2009, 10, 20, 14, 39, 13) 
+4

Dotyczy tylko Pythona 3. –

+2

Dlaczego dotyczy to tylko Pythona 3? Wydaje się, że działa dobrze w 2.7. – sevko

3

myślę, że można użyć metody utcoffset():

utc_time = datetime1 - datetime1.utcoffset() 

Docs dać przykład tego przy użyciu metody astimezone()here .

Dodatkowo, jeśli masz zamiar mieć do czynienia ze stref czasowych, warto zajrzeć do PyTZ library które ma wiele przydatnych narzędzi do konwersji datetime-tych do różnych stref czasowych (w tym pomiędzy EST a UTC)

Z PyTZ :

from datetime import datetime 
import pytz 

utc = pytz.utc 
eastern = pytz.timezone('US/Eastern') 

# Using datetime1 from the question 
datetime1 = datetime.strptime(somestring, "%Y-%m-%dT%H:%M:%S") 

# First, tell Python what timezone that string was in (you said Eastern) 
eastern_time = eastern.localize(datetime1) 

# Then convert it from Eastern to UTC 
utc_time = eastern_time.astimezone(utc) 
+0

+1 dla lokalizatora pytz(). Uwaga: 'datetime1' w pytaniu jest naiwnym obiektem datetime, tzn.' Datetime1.utcoffset() 'zwraca' None' (nie można uzyskać czasu UTC w ten sposób). – jfs

1

prawdopodobnie chcesz jeden z tych dwóch:

import time 
import datetime 

from email.Utils import formatdate 

rightnow = time.time() 

utc = datetime.datetime.utcfromtimestamp(rightnow) 
print utc 

print formatdate(rightnow) 

dwa wyjścia wyglądać następująco

2009-10-20 14:46:52.725000 
Tue, 20 Oct 2009 14:46:52 -0000 
Powiązane problemy