Mam do czynienia z datami w Pythonie i muszę je przekonwertować na znaczniki czasu UTC, aby mogły być używane w JavaScript. Poniższy kod nie działa:
>>> d = datetime.date(2011,01,01)
>>> datetime.datetime.utcfromtimestamp(time.mktime(d.timetuple()))
datetime.datetime(2010, 12, 31, 23, 0)
Konwersja obiektu daty najpierw na datę i godzinę również nie pomaga. Próbowałem tego przykładu pod tym linkiem , ale:
from pytz import utc, timezone
from datetime import datetime
from time import mktime
input_date = datetime(year=2011, month=1, day=15)
a teraz albo:
mktime(utc.localize(input_date).utctimetuple())
lub
mktime(timezone('US/Eastern').localize(input_date).utctimetuple())
działa.
Tak ogólne pytanie: jak mogę przekonwertować datę na sekundy od epoki według UTC?
datetime.date
, drugi próbuje przekonwertować ciąg znaków z jednej strefy czasowej na drugą. Jako ktoś, kto szuka rozwiązania tego problemu, nie mogę stwierdzić, że ten drugi udzieli odpowiedzi, której szukam.Odpowiedzi:
Jeśli
d = date(2011, 1, 1)
jest w UTC:Jeśli
d
znajduje się w lokalnej strefie czasowej:timestamp1
itimestamp2
może się różnić, jeśli północ w lokalnej strefie czasowej nie jest tą samą instancją czasu, co północ w UTC.mktime()
może zwrócić nieprawidłowy wynik, jeślid
odpowiada niejednoznacznemu czasowi lokalnemu (np. podczas przejścia DST) lub jeślid
jest przeszłością (przyszłą) datą, w której przesunięcie utc mogło być inne, a Cmktime()
nie ma dostępu do bazy danych tz na danej platformie . Możesz użyćpytz
modułu (np. Viatzlocal.get_localzone()
), aby uzyskać dostęp do bazy danych tz na wszystkich platformach . Ponadtoutcfromtimestamp()
może się nie powieść imktime()
może zwrócić znacznik czasu inny niż POSIX, jeśli"right"
używana jest strefa czasowa .Aby przekonwertować
datetime.date
obiekt reprezentujący datę w UTC bezcalendar.timegm()
:Jak mogę przekonwertować datę na sekundy od epoki zgodnie z UTC?
Aby przekonwertować
datetime.datetime
(niedatetime.date
) obiekt, który już reprezentuje czas w UTC, na odpowiedni znacznik czasu POSIX (afloat
).Python 3.3+
datetime.timestamp()
:Uwaga: Konieczne jest
timezone.utc
jawne podanie w innym przypadku.timestamp()
założenia, że naiwny obiekt typu data-godzina znajduje się w lokalnej strefie czasowej.Python 3 (<3.3)
Z dokumentów dotyczących
datetime.utcfromtimestamp()
:Ciekawa lektura: Czas epoki a pora dnia na podstawie różnicy między Którą to jest godziną? i ile sekund upłynęło?
Zobacz także: datetime potrzebuje metody „epoki”
Python 2
Aby dostosować powyższy kod dla Python 2:
gdzie
timedelta.total_seconds()
jest równoważne do(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
obliczonego z włączonym prawdziwym dzieleniem.Przykład
Uważaj na problemy zmiennoprzecinkowe .
Wynik
Jak przekonwertować świadomy
datetime
obiekt na znacznik czasu POSIXW Pythonie 3:
W Pythonie 2:
źródło
timestamp = (dt - datetime.fromtimestamp(0)).total_seconds()
:?datetime(1970, 1, 1)
jest bardziej wyraźny.fromtimestamp()
jest tutaj niepoprawny (dt
jest w UTC, więcutcfromtimestamp()
należy go użyć).totimestamp()
funkcję w odpowiedzi.Tylko dla systemów unix :
Uwaga 1: dizzyf zauważył, że dotyczy to zlokalizowanych stref czasowych . Nie używaj w produkcji.
Uwaga 2: Jakub Narębski zauważył, że ignoruje to informacje o strefie czasowej nawet w przypadku datetime z uwzględnieniem przesunięcia (testowane dla Python 2.7).
źródło
man strftime
w systemach uniksopodobnych.Założenie 1: Próbujesz przekonwertować datę na znacznik czasu, jednak ponieważ data obejmuje 24 godziny, nie ma jednego znacznika czasu reprezentującego tę datę. Zakładam, że chcesz reprezentować znacznik czasu tej daty o północy (00: 00: 00.000).
Założenie 2: Data, którą prezentujesz, nie jest powiązana z określoną strefą czasową, jednak chcesz ustalić przesunięcie względem określonej strefy czasowej (UTC). Bez znajomości strefy czasowej, w której jest data, nie można obliczyć znacznika czasu dla określonej strefy czasowej. Zakładam, że chcesz traktować datę tak, jakby była w lokalnej strefie czasowej systemu.
Po pierwsze, możesz przekonwertować instancję daty na krotkę reprezentującą różne składniki czasu za pomocą elementu
timetuple()
członkowskiego:Następnie możesz przekonwertować to na znacznik czasu, używając
time.mktime
:Możesz zweryfikować tę metodę, testując ją z samym czasem epoki (1970-01-01), w którym to przypadku funkcja powinna zwrócić przesunięcie strefy czasowej dla lokalnej strefy czasowej w tym dniu:
28800.0
to 8 godzin, co byłoby poprawne dla strefy czasowej Pacyfiku (gdzie jestem).źródło
postępuj zgodnie z dokumentem python2.7, musisz użyć calendar.timegm () zamiast time.mktime ()
źródło
d
jest w UTC?Zdefiniowałem własne dwie funkcje
tutaj:
źródło
pytanie jest trochę zdezorientowane. znaczniki czasu nie są UTC - są uniksowe. data może być UTC? zakładając, że tak jest, a jeśli używasz języka Python 3.2+, prosta data sprawia, że jest to banalne:
jeśli faktycznie masz rok, miesiąc i dzień, nie musisz tworzyć
date
:a jeśli data jest w innej strefie czasowej (ma to znaczenie, ponieważ zakładamy północ bez powiązanego czasu):
[idea simple-date polega na zebraniu wszystkich dat i godzin Pythona w jednej spójnej klasie, aby można było przeprowadzić dowolną konwersję. na przykład pójdzie w drugą stronę:
]
źródło
SimpleDate(date(2011,1,1), tz='America/New_York')
podnosiNoTimezone
, apytz.timezone('America/New_York')
nie podnosi żadnych wyjątków (simple-date==0.4.8
,pytz==2014.7
).pip install simple-date
Pojawia się błąd , wygląda na to , że jest to tylko python3 / pip3.Za pomocą pakietu strzałek :
źródło
arrow
używadateutil
idateutil
zna od wielu lat błędy związane z obsługą stref czasowych. Nie używaj go, jeśli potrzebujesz poprawnych wyników dla stref czasowych z nieokreślonym przesunięciem UTC (dobrze jest użyć go dla strefy czasowej UTC, ale stdlib obsługuje również przypadek UTC).Pełny ciąg czasu zawiera:
[+HHMM or -HHMM]
Na przykład:
1970-01-01 06:00:00 +0500
==1970-01-01 01:00:00 +0000
==UNIX timestamp:3600
Uwaga:
Edytować:
źródło
1970-01-01 06:00:00 +0500
na,3600
o co prosiłeś.timezone
wpython2
, można wykonać obliczenia (06:00:00
-+0500
=01:00:00
) ręcznie.Biorąc pod uwagę, że masz
datetime
obiekt o nazwied
, użyj następującego polecenia, aby uzyskać znacznik czasu w UTC:I w przeciwnym kierunku użyj następujących poleceń:
źródło
Jestem pod wrażeniem głębokiej dyskusji.
moje 2 centy:
od daty importu do godziny importu
znacznik czasu w utc to:
lub,
jeśli teraz wynika z datetime.now (), w tym samym DST
źródło