Как создать дату и время в Python из миллисекунд?

143

Я могу создать аналогичный объект Date в Java с помощью java.util.Date (миллисекунды) . Как создать аналог на Python?

Выделяет объект Date и инициализирует его для представления указанного количества миллисекунд с момента стандартного базового времени, известного как «эпоха», а именно 1 января 1970 г., 00:00:00 по Гринвичу.

Джошуа
источник

Ответы:

216

Просто преобразуйте его в метку времени

datetime.datetime.fromtimestamp(ms/1000.0)
Vartec
источник
17
Примечание - в Python 3 (/) будет выполнять деление с плавающей запятой. Чтобы выполнить целочисленное деление, используйте (//).
Джон Милликин,
3
Разве вы на самом деле не хотите деления с плавающей запятой? В противном случае вы теряете точность менее 1 секунды (удерживается в дробной части метки времени). Лучше использовать ms / 1000.0 без усечения.
Брайан,
4
Конечно, datetime всегда поддерживает это? Если у нас точность меньше секунды, то выбрасывать это неправильно. Если мы этого не сделаем, вреда не будет - мы просто сохраним исходную точность.
Брайан,
30
Чтобы сохранить точность без использования поплавков, вы также можете:datetime.utcfromtimestamp(ms//1000).replace(microsecond=ms%1000*1000)
tsg
2
другая проблема с этим решением: fromtimestamp () может вызвать ValueError, если временная метка выходит за пределы диапазона значений, поддерживаемых функциями localtime () или gmtime () платформы C. Обычно это ограничивается годами с 1970 по 2038.» - как долго ваш код прослужит ???
mike rodent
12

Как насчет этого? Я полагаю, что на него можно рассчитывать даты до 1970 и после 2038 года.

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

как указано в стандартной библиотеке Python:

fromtimestamp () может вызвать ValueError, если временная метка находится за пределами диапазона значений, поддерживаемых функциями localtime () или gmtime () платформы C. Обычно это ограничивается годами с 1970 по 2038 год.

Майк Грызун
источник
6
вы могли бы использоватьutc_time = datetime(1970, 1, 1) + timedelta(milliseconds=millis)
jfs
9

Немного тяжеловато из-за использования панд, но работает:

import pandas as pd
pd.to_datetime(msec_from_java, unit='ms').to_pydatetime()
MDE
источник
2
import pandas as pd

Date_Time = pd.to_datetime(df.NameOfColumn, unit='ms')
Артем Крылов
источник
0

Преобразование миллис в дату и время (UTC):

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

Преобразование datetime в строку в соответствии со стандартом RFC3339 (используется спецификацией Open API):

from rfc3339 import rfc3339
converted_to_str = rfc3339(dt, utc=True, use_system_timezone=False)
# 2020-08-04T11:58:05Z
Каен
источник