@Hasteur, tak. Druga liczba reprezentuje liczbę sekund, które upłynęły między początkiem epoki uniksowej a określoną datą. Ten format jest również określany jako czas POSIX.
eikonomega
Odpowiedzi:
317
>>>import time>>>import datetime>>> s ="01/12/2011">>> time.mktime(datetime.datetime.strptime(s,"%d/%m/%Y").timetuple())1322697600.0
zakłada północ 01.12.2011 w lokalnej strefie czasowej. Jeśli dane wejściowe są w UTC; możesz użyć calendar.timegm()lub.toordinal()
jfs
50
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()jest nieco krótszy
timdiels
11
@timdiels: ponownie. .timestamp()zakłada czas lokalny zamiast UTC, jeśli nie podano wyraźnej strefy czasowej. Kod w odpowiedzi działa (tworzy oczekiwany 1322697600) tylko na komputerze, na którym lokalna strefa czasowa ma zerowe przesunięcie utc.
jfs
7
to nie działa: datetime.datetime.strptime („2014: 06: 28 11:53:21”, „% Y:% m:% d% H:% M:% S”). timestamp () Traceback ( ostatnie wywołanie ostatnie): Plik „<stdin>”, wiersz 1, w <module> AttributeError: Obiekt „datetime.datetime” nie ma atrybutu „timestamp”
Kiedy uruchomić przykłady w tym poście, pojawia się błąd: NameError: name 'wckCalendar' is not defined. Używam Python 3.4.1 na maszynie z systemem Windows 32 bity. Dowolny pomysł? Dzięki.
poniedziałek
1
@sedeh w poście nie ma wckCalendar. Sprawdź swój kod.
jfs
@JFSebastian Dokładnie, a ja nie próbowałem zadzwonić bezpośrednio do wckCalendar. Po prostu pojawia się w komunikacie o błędzie. Zobacz mój post tutaj omawiający problem.
poniedziałek
1
@ törzsmókus: Jeśli odpowiedź jest błędna, nie ma znaczenia, jak jest czytelna.
jfs
1
@ törzsmókus: spójrz na moją odpowiedź: może dać dwie różne liczby. Twoja odpowiedź tworzy jeden numer, nie wspominając, który.
Liczy się czytelność. Zobacz moją odpowiedź dotyczącą dateutil, aby uzyskać rozwiązanie bardziej czytelne dla człowieka.
törzsmókus
21
Odpowiedź zależy również od strefy czasowej wejścia. Jeśli twoja data jest datą lokalną, możesz użyć mktime (), jak powiedział Katrielalex - tylko nie rozumiem, dlaczego użył datetime zamiast tej krótszej wersji:
Wiele z tych odpowiedzi nie przeszkadza, że data jest naiwna na początek
Aby być poprawnym, musisz najpierw ustawić naiwną datę jako datę i strefę czasową
import datetime
import pytz
# naive datetime
d = datetime.datetime.strptime('01/12/2011','%d/%m/%Y')>>> datetime.datetime(2011,12,1,0,0)# add proper timezone
pst = pytz.timezone('America/Los_Angeles')
d = pst.localize(d)>>> datetime.datetime(2011,12,1,0,0,
tzinfo=<DstTzInfo'America/Los_Angeles' PST-1 day,16:00:00 STD>)# convert to UTC timezone
utc = pytz.UTC
d = d.astimezone(utc)>>> datetime.datetime(2011,12,1,8,0, tzinfo=<UTC>)# epoch is the beginning of time in the UTC timestamp world
epoch = datetime.datetime(1970,1,1,0,0,0,tzinfo=pytz.UTC)>>> datetime.datetime(1970,1,1,0,0, tzinfo=<UTC>)# get the total second difference
ts =(d - epoch).total_seconds()>>>1322726400.0
# Don't do this:
d = datetime.datetime(2011,12,1,0,0,0, tzinfo=pytz.timezone('America/Los_Angeles'))>>> datetime.datetime(2011,1,12,0,0,
tzinfo=<DstTzInfo'America/Los_Angeles' LMT-1 day,16:07:00 STD>)# tzinfo in not PST but LMT here, with a 7min offset !!!# when converting to UTC:
d = d.astimezone(pytz.UTC)>>> datetime.datetime(2011,1,12,7,53, tzinfo=<UTC>)# you end up with an offset
Jaka jest datetimefunkcja datetimez datetimebiblioteki nie obsługuje.timestamp()
Joooeey
@Joooeey: Tak, w Pythonie 3.3 lub nowszym . Nie było dostępne, gdy pytanie zostało opublikowane, ale jest dostępne od września 2012 r.
ShadowRanger
0
wystarczy użyć datetime.timestamp (instancja datetime), instancja datetime zawiera informację o strefie czasowej, więc znacznik czasu będzie standardowym znacznikiem czasu utc. jeśli przekształcisz datetime w harmonogram, straci strefę czasową, więc wynikiem będzie błąd. jeśli chcesz zapewnić interfejs, powinieneś napisać w ten sposób: int (datetime.timestamp (instancja_czasu)) * 1000
my_date ='2020/08/08'
my_date = my_date.replace('/','-')# just to adapte to your question
date_timestamp = datetime.datetime.fromisoformat(my_date).timestamp()
Odpowiedzi:
źródło
calendar.timegm()
lub.toordinal()
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()
jest nieco krótszy.timestamp()
zakłada czas lokalny zamiast UTC, jeśli nie podano wyraźnej strefy czasowej. Kod w odpowiedzi działa (tworzy oczekiwany1322697600
) tylko na komputerze, na którym lokalna strefa czasowa ma zerowe przesunięcie utc.Używam
ciso8601
, co jest 62 razy szybsze niż czas datetime.Możesz dowiedzieć się więcej tutaj .
źródło
Aby przekonwertować ciąg na obiekt daty:
Sposób konwersji obiektu daty na znacznik czasu POSIX zależy od strefy czasowej. Od konwersji
datetime.date
do znacznika czasu UTC w Pythonie :Obiekt daty reprezentuje północ w UTC
Obiekt daty reprezentuje północ w czasie lokalnym
Znaczniki czasu są różne, chyba że północ w UTC i czas lokalny to ta sama instancja czasu.
źródło
NameError: name 'wckCalendar' is not defined
. Używam Python 3.4.1 na maszynie z systemem Windows 32 bity. Dowolny pomysł? Dzięki.źródło
"%s"
nie jest obsługiwany przez Python . To nie jest przenośne.Odpowiedź zależy również od strefy czasowej wejścia. Jeśli twoja data jest datą lokalną, możesz użyć mktime (), jak powiedział Katrielalex - tylko nie rozumiem, dlaczego użył datetime zamiast tej krótszej wersji:
Ale zauważ, że mój wynik jest inny niż jego, ponieważ prawdopodobnie jestem w innym TZ (a wynikiem jest wolny od strefy czasowej znacznik czasu UNIX)
Teraz, jeśli data wejścia jest już w UTC, to uważam, że właściwym rozwiązaniem jest:
źródło
Po prostu użyj
datetime.datetime.strptime
:Wynik:
Aby użyć UTC zamiast lokalnej strefy czasowej
.replace
:źródło
float
nieint
Najpierw musisz klasę strptime, aby przekonwertować ciąg do formatu struct_time.
Następnie wystarczy użyć stamtąd mktime, aby uzyskać pływak.
źródło
Wiele z tych odpowiedzi nie przeszkadza, że data jest naiwna na początek
Aby być poprawnym, musisz najpierw ustawić naiwną datę jako datę i strefę czasową
Również:
Bądź ostrożny, używając
pytz
dotzinfo
wdatetime.datetime
pracy nie dla wielu stref czasowych. Zobacz datetime w strefie czasowej pytz. Różne przesunięcie w zależności od ustawienia tzinfohttps://en.wikipedia.org/wiki/Local_mean_time
źródło
Sugerowałbym dateutil :
źródło
"%d/%m/%Y"
formacie. Porównaj:dateutil.parser.parse("01/02/2001")
idatetime.strptime("01/02/2001", "%d/%m/%Y")
1322697600
chyba że twoją lokalną strefą czasową jest UTC. Zobacz mój komentarz od 2014Wydaje się być dość wydajny:
1,61 µs ± 120 ns na pętlę (średnia ± odchylenie standardowe z 7 serii, każda 100000 pętli)
źródło
datetime
funkcjadatetime
zdatetime
biblioteki nie obsługuje.timestamp()
wystarczy użyć datetime.timestamp (instancja datetime), instancja datetime zawiera informację o strefie czasowej, więc znacznik czasu będzie standardowym znacznikiem czasu utc. jeśli przekształcisz datetime w harmonogram, straci strefę czasową, więc wynikiem będzie błąd. jeśli chcesz zapewnić interfejs, powinieneś napisać w ten sposób: int (datetime.timestamp (instancja_czasu)) * 1000
źródło
Możesz skorzystać z tego linku, aby użyć
strptime
funkcji zdatetime.datetime
, aby przekonwertować datę z dowolnego formatu wraz ze strefą czasową.https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior
źródło
możesz przekonwertować na izoformat
źródło
Prosta funkcja pozwalająca uzyskać czas UNIX Epoki.
UWAGA : Ta funkcja zakłada, że data i godzina wprowadzenia są w formacie UTC (patrz komentarze tutaj).
Zastosowanie :
źródło