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

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

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


person Joshua    schedule 14.04.2009    source источник


Ответы (4)


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

datetime.datetime.fromtimestamp(ms/1000.0)
person vartec    schedule 14.04.2009
comment
Примечание - в Python 3 (/) будет выполнять деление с плавающей запятой. Чтобы выполнить целочисленное деление, используйте (//). - person John Millikin; 14.04.2009
comment
Разве вы на самом деле не хотите деления с плавающей запятой? В противном случае вы потеряете любую точность ниже 1 секунды (удерживается в дробной части метки времени). Лучше использовать ms / 1000.0 без усечения. - person Brian; 14.04.2009
comment
Не все платформы поддерживают дробные метки времени - лучше придерживаться целых чисел POSIX. - person John Millikin; 15.04.2009
comment
Конечно, datetime всегда поддерживает это? Если у нас точность меньше секунды, то выбрасывать ее кажется неправильным. Если мы этого не сделаем, вреда не будет - мы просто сохраним исходную точность. - person Brian; 15.04.2009
comment
Чтобы сохранить точность без использования числа с плавающей запятой, вы также можете: datetime.utcfromtimestamp(ms//1000).replace(microsecond=ms%1000*1000) - person tsg; 10.11.2012
comment
другая проблема с этим решением: fromtimestamp () может вызвать ValueError, если временная метка выходит за пределы диапазона значений, поддерживаемых функциями localtime () или gmtime () платформы C. Обычно это ограничивается годами с 1970 по 2038 год. - Как долго, как ожидается, прослужит ваш код ??? - person mike rodent; 25.07.2015
comment
Это дает местное время. Как я могу получить gmt - person Yajana Rao; 20.09.2018
comment
ПОЧЕМУ это исключение было до 1970 года? Разве это не те годы? - person canbax; 17.04.2020

Что насчет этого? Я полагаю, что на него можно рассчитывать даты до 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 год.

person mike rodent    schedule 25.07.2015
comment
вы могли бы использовать utc_time = datetime(1970, 1, 1) + timedelta(milliseconds=millis) - person jfs; 26.07.2015

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

import pandas as pd
pd.to_datetime(msec_from_java, unit='ms').to_pydatetime()
person mde    schedule 21.02.2019
comment
это эффективно для массового преобразования и возвращает объект Series - person CannedScientist; 30.06.2021

Преобразование миллис в дату и время (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
person cahen    schedule 04.08.2020