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


143

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

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

Ответы:


216

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

datetime.datetime.fromtimestamp(ms/1000.0)

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()


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.