Przepraszam za proste pytanie ... Jestem nowy w Pythonie ... Szukałem i nic nie działa.
Mam kilka obiektów z datetime i chcę obliczyć liczbę sekund od ustalonego czasu w przeszłości dla każdego z nich (na przykład od 1 stycznia 1970 r.).
import datetime
t = datetime.datetime(2009, 10, 21, 0, 0)
Wydaje się, że rozróżnia to tylko daty z różnymi dniami:
t.toordinal()
Każda pomoc jest mile widziana.
python
python-2.7
Nathan Lippi
źródło
źródło
datetime.date
na znacznik czasu UTC w Pythonieint(t.timestamp())
Odpowiedzi:
Na specjalną datę 1 stycznia 1970 r. Istnieje wiele opcji.
Dla każdej innej daty początkowej musisz uzyskać różnicę między tymi dwiema datami w sekundach. Odejmowanie dwóch dat daje
timedelta
obiekt, który od Pythona 2.7 pełnitotal_seconds()
funkcję.Data rozpoczęcia jest zwykle określona w UTC, więc aby uzyskać prawidłowe wyniki
datetime
, należy podać również tę formułę w UTC. Jeślidatetime
nie ma Cię jeszcze w UTC, musisz go przekonwertować przed użyciem lub dołączyćtzinfo
klasę o odpowiednim przesunięciu.Jak zauważono w komentarzach, jeśli masz
tzinfo
załącznik do niegodatetime
, będziesz go również potrzebować w dniu rozpoczęcia, w przeciwnym razie odejmowanie się nie powiedzie; dla powyższego przykładu dodałbym,tzinfo=pytz.utc
jeśli używasz Python 2 lubtzinfo=timezone.utc
jeśli używasz Python 3.źródło
datetime.datetime(1970,1,1,tzinfo=pytz.utc)
.datetime.datetime.utcfromtimestamp(0)
Użyłem tego, aby łatwo uzyskać „epokę”. Pamiętaj, że epoka nie zawsze jest taka sama we wszystkich systemach.time.time()
idatetime.now() - datetime(1970, 1, 1)
różnią się o 7200 sekund. Raczej użyć(t - datetime.datetime.fromtimestamp(0)).total_seconds()
. Czy nie używaćutcfromtimestamp(0)
, jeśli chcesz przekonwertować datetime w lokalnej strefy czasowej.Aby uzyskać czas uniksowy (sekundy od 1 stycznia 1970 r.):
źródło
t
jest to czas lokalny. Przesunięcie UTC dla lokalnej strefy czasowej mogło być inne w przeszłości i jeślimktime()
(biblioteka C) nie ma dostępu do danych historycznych strefy czasowej na danej platformie, może się nie powieść (pytz
jest to przenośny sposób na dostęp do bazy danych tz). Również czas lokalny może być niejednoznaczny, np. Podczas przejścia czasu letniego - potrzebujesz dodatkowych informacji, aby ujednoznacznić, np. Jeśli wiesz, że kolejne wartości daty / godziny powinny rosnąć w pliku dziennikatime.mktime(datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timetuple())
skutkuje1564819506.0
cichym upuszczeniem milisekund, aledatetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timestamp()
(odpowiedź Andrzeja Pronobisa) powoduje1564819506.912
oczekiwany wynik.Począwszy od Python 3.3,
datetime.timestamp()
metoda ta staje się bardzo łatwa . Przyda się to oczywiście tylko wtedy, gdy potrzebujesz liczby sekund od 1970-01-01 UTC.Zwracana wartość będzie liczbą zmiennoprzecinkową reprezentującą nawet ułamki sekundy. Jeśli data-godzina jest naiwna dla strefy czasowej (jak w powyższym przykładzie), zakłada się, że obiekt datetime reprezentuje czas lokalny, tzn. Będzie to liczba sekund od bieżącej godziny w Twojej lokalizacji do 1970-01-01 UTC.
źródło
Może nie na temat: aby uzyskać czas UNIX / POSIX z datetime i przekonwertować go z powrotem:
Zauważ, że różne strefy czasowe mają wpływ na wyniki, np. Moje obecne zwroty TZ / DST:
dlatego należy rozważyć normalizację do UTC przy użyciu wersji funkcji UTC.
Pamiętaj, że poprzedni wynik może być wykorzystany do obliczenia przesunięcia UTC bieżącej strefy czasowej. W tym przykładzie jest to + 1h, tj. UTC + 0100.
Bibliografia:
źródło
mktime()
może zawieść . Ogólnie rzecz biorąc, musiszpytz
przekonwertować czas lokalny na utc, aby uzyskać znacznik czasu POSIX.int (t.strftime("%s"))
działa równieżźródło
import datetime; t = datetime.datetime(2011, 10, 21, 0, 0)
(jak określono przez OP). Ale tak naprawdę wątpię, aby% s to ostatnio dodany format czasu.%s
nie jest obsługiwany (może działać na niektórych platformach ifft
jest naiwnym obiektem typu data-godzina reprezentującym czas lokalny i jeśli lokalna biblioteka C ma dostęp do bazy danych tz, w przeciwnym razie wynik może być nieprawidłowy). Nie używaj tego.%s
nie jest nigdzie udokumentowane. Siałem to w prawdziwym kodzie i zastanawiałem się, co to jest, i zajrzałem do dokumentacji i nie ma czegoś takiego jak%s
. Jest tylko z dużym S tylko na kilka sekund.z dokumentacji Pythona:
Zwraca całkowitą liczbę sekund zawartą w czasie trwania. Równoważny
obliczone przy włączonym prawdziwym dzieleniu.
Należy pamiętać, że w przypadku bardzo dużych przedziałów czasowych (dłuższych niż 270 lat na większości platform) metoda ta straci mikrosekundową dokładność.
Ta funkcja jest nowa w wersji 2.7.
źródło
Aby przekonwertować obiekt datetime reprezentujący czas w UTC na znacznik czasu POSIX :
Aby przekonwertować obiekt datetime reprezentujący czas w lokalnej strefie czasowej na znacznik czasu POSIX:
Zobacz Jak przekonwertować czas lokalny na UTC w Pythonie? Jeśli baza danych tz jest dostępna na danej platformie; rozwiązanie tylko dla stdlib może działać .
Skorzystaj z łączy, jeśli potrzebujesz rozwiązań dla
<3.3
wersji Python.źródło
Wypróbowałem standardowy kalendarz.timegm biblioteki i działa całkiem dobrze:
Patrz: https://docs.python.org/2/library/calendar.html#calendar.timegm
źródło
aDateTime
jest to czas UTC