Muszę utworzyć wartość „Wygasa” za 5 minut w przyszłości, ale muszę ją podać w formacie sygnatury czasowej UNIX. Mam to do tej pory, ale wygląda to na włamanie.
def expires():
'''return a UNIX style timestamp representing 5 minutes from now'''
epoch = datetime.datetime(1970, 1, 1)
seconds_in_a_day = 60 * 60 * 24
five_minutes = datetime.timedelta(seconds=5*60)
five_minutes_from_now = datetime.datetime.now() + five_minutes
since_epoch = five_minutes_from_now - epoch
return since_epoch.days * seconds_in_a_day + since_epoch.seconds
Czy istnieje moduł lub funkcja, która wykonuje dla mnie konwersję znacznika czasu?
python
datetime
unix-timestamp
Daniel Rhoden
źródło
źródło
Odpowiedzi:
Innym sposobem jest użycie
calendar.timegm
:Jest również bardziej przenośny niż
%s
flaga dostrftime
(która nie działa w systemie Windows).źródło
calendar.timegm(future.utctimetuple())
. Zapewnia to, że czas UTC jest przekazywanycalendar.timegm
.21600.0
sekundy (6 godzin) zamiast 0,0 dla TZ mojej maszyny uniksowejcalendar.timegm(datetime.datetime.utcnow().timetuple())
. Użycie metodydatetime.datetime.now().utctimetuple()
nie działa dla mnie (Python 3.2).Teraz w Pythonie> = 3.3 możesz po prostu wywołać metodę timestamp (), aby uzyskać znacznik czasu jako zmiennoprzecinkowy.
źródło
datetime.now()
) jest zły, ponieważ zachęca do korzystania z naiwnych obiektów typu data-godzina reprezentujących czas lokalny i może zawieść podczas przejścia DST (z powodu wewnętrznej niejednoznaczności). Możeszts = datetime.now(timezone.utc).timestamp()
zamiast tego użyć .utcnow()
. Jestem przyzwyczajony do pracy na komputerach, na których strefa czasowa jest ustawiona na UTC, ale nie należy tego zakładać w tym fragmencie kodu.Właśnie to znalazłem, a nawet jeszcze krócej.
źródło
time.time()
można cofnąć. Aby utworzyć wartość „Wygasa” za 5 minut w przyszłości, może być potrzebnytime.monotonic()
analog w zależności od przypadku użycia.monotonic
można użyć, zależy od przypadku użycia, np.subprocess
Moduł używa go do implementacjitimeout
opcji.Oto, czego potrzebujesz:
źródło
mktime(dt.timetuple())
.datetime.now(timezone.utc).timestamp()
dostarczone przez @Tim Tisdall jest rozwiązaniem w Python 3.3+. W przeciwnym razie(dt - epoch).total_seconds()
można zastosować .datetime.strftime
Aby uzyskać czas w formie Epoki, możesz użyć%s
ciągu formatu:Uwaga: Działa to tylko w systemie Linux i ta metoda nie działa w strefach czasowych.
źródło
ValueError: Invalid format string
).Oto mniej zepsute
datetime
rozwiązanie do konwersji z obiektu datetime na znacznik czasu POSIX:Zobacz więcej szczegółów w Konwertowanie datetime.date na znacznik czasu UTC w Pythonie .
źródło
źródło
Kluczem jest upewnienie się, że wszystkie używane daty znajdują się w strefie czasowej utc przed rozpoczęciem konwersji. Zobacz http://pytz.sourceforge.net/ aby dowiedzieć się, jak to zrobić poprawnie. Normalizując do utc, eliminujesz niejednoznaczność zmian czasu letniego. Następnie możesz bezpiecznie użyć timedelta, aby obliczyć odległość od epoki uniksowej, a następnie przekonwertować na sekundy lub milisekundy.
Zauważ, że wynikowy znacznik czasu unix sam jest w strefie czasowej UTC. Jeśli chcesz zobaczyć znacznik czasu w zlokalizowanej strefie czasowej, musisz wykonać kolejną konwersję.
Pamiętaj też, że będzie to działać tylko w przypadku dat po 1970 roku.
źródło
1970-01-01 00:00:00+00:00
). Aby uzyskać naiwny obiektdatetime.fromtimestamp(ts)
Poniższe informacje oparte są na powyższych odpowiedziach (plus poprawka na milisekundy) i emulują
datetime.timestamp()
dla Pythona 3 przed 3.3, gdy używane są strefy czasowe.Aby ściśle odpowiedzieć na zadane pytanie, chcesz:
datetime_timestamp
jest częścią simple-date . Ale jeśli korzystasz z tego pakietu, prawdopodobnie wpisz:który obsługuje wiele innych formatów / typów dla my_datetime.
źródło
źródło
Zauważ, że rozwiązania
timedelta.total_seconds()
działające na Python-2.7 +. Użyjcalendar.timegm(future.utctimetuple())
dla niższych wersji Pythona.źródło