Jak utworzyć datę i godzinę w Pythonie z milisekund?

147

Mogę utworzyć podobny obiekt Date w Javie przez java.util.Date (milisekundy) . Jak stworzyć porównywalne w Pythonie?

Przydziela obiekt Date i inicjalizuje go, aby reprezentował określoną liczbę milisekund od standardowego czasu bazowego zwanego „epoką”, czyli 1 stycznia 1970 r. O godzinie 00:00:00 czasu GMT.

Joshua
źródło

Odpowiedzi:

229

Po prostu przekonwertuj go na znacznik czasu

datetime.datetime.fromtimestamp(ms/1000.0)
vartec
źródło
17
Uwaga - w Pythonie 3 (/) wykonuje dzielenie zmiennoprzecinkowe. Aby wykonać dzielenie całkowe, użyj (//).
John Millikin,
4
Czy w ogóle nie chcesz podziału typu float? W przeciwnym razie tracisz precyzję poniżej 1 sekundy (utrzymywaną w ułamkowej części znacznika czasu). Lepiej używać ms / 1000.0 bez obcinania.
Brian
4
Z pewnością jednak datetime to zawsze obsługuje? Jeśli mamy precyzję poniżej sekundy, odrzucenie jej wydaje się niewłaściwe. Jeśli tego nie zrobimy, nic się nie stanie - po prostu zachowujemy tę oryginalną precyzję.
Brian
33
Aby zachować precyzję bez używania pływaków, możesz również wykonać:datetime.utcfromtimestamp(ms//1000).replace(microsecond=ms%1000*1000)
tsg
2
inny problem z tym rozwiązaniem: „fromtimestamp () może wywołać błąd ValueError, jeśli znacznik czasu jest poza zakresem wartości obsługiwanych przez funkcje localtime () lub gmtime () platformy C. Często jest to ograniczone do lat od 1970 do 2038. ” - jak długo ma trwać twój kod ???
mike gryzoń
12

A co z tym? Przypuszczam, że można liczyć na to, że poradzi sobie z datami sprzed 1970 roku i po 2038 roku.

target_date_time_ms = 200000 # or whatever
base_datetime = datetime.datetime( 1970, 1, 1 )
delta = datetime.timedelta( 0, 0, 0, target_date_time_ms )
target_date = base_datetime + delta

jak wspomniano w standardowej bibliotece języka Python:

fromtimestamp () może zgłosić błąd ValueError, jeśli znacznik czasu jest poza zakresem wartości obsługiwanych przez funkcje platformy C localtime () lub gmtime (). Powszechne jest to, że ogranicza się to do lat od 1970 do 2038.

mike gryzoń
źródło
6
możesz użyćutc_time = datetime(1970, 1, 1) + timedelta(milliseconds=millis)
jfs
9

Trochę ciężki z powodu używania pand, ale działa:

import pandas as pd
pd.to_datetime(msec_from_java, unit='ms').to_pydatetime()
mde
źródło
2
import pandas as pd

Date_Time = pd.to_datetime(df.NameOfColumn, unit='ms')
Artem Krylov
źródło
0

Zamiana milis na datetime (UTC):

import datetime
time_in_millis = 1596542285000
dt = datetime.datetime.fromtimestamp(time_in_millis / 1000.0, tz=datetime.timezone.utc)

Konwersja daty i godziny na ciąg zgodnie ze standardem RFC3339 (używanym przez specyfikację Open API):

from rfc3339 import rfc3339
converted_to_str = rfc3339(dt, utc=True, use_system_timezone=False)
# 2020-08-04T11:58:05Z
cahen
źródło