перетворення часу епохи з мілісекундами в час часу


79

Я використовував рубіновий скрипт для конвертації мітки часу iso в епоху, файли, які я аналізую, мають таку структуру мітки часу:

2009-03-08T00:27:31.807

Оскільки я хочу зберегти мілісекунди, я використав наступний рубіновий код для перетворення його в епоху:

irb(main):010:0> DateTime.parse('2009-03-08T00:27:31.807').strftime("%Q")
=> "1236472051807"

Але в python я спробував наступне:

import time 
time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(1236472051807))

Але я не отримую початковий час, час назад,

>>> time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(1236472051807))
'41152-03-29 02:50:07'
>>> 

Цікаво, це пов’язано з тим, як я форматую?

Відповіді:


144

Використання datetime.datetime.fromtimestamp:

>>> import datetime
>>> s = 1236472051807 / 1000.0
>>> datetime.datetime.fromtimestamp(s).strftime('%Y-%m-%d %H:%M:%S.%f')
'2009-03-08 09:27:31.807000'

%fдиректива підтримується лише datetime.datetime.strftime, а не time.strftime.

UPDATE Alternative використання %, str.format:

>>> import time
>>> s, ms = divmod(1236472051807, 1000)  # (1236472051, 807)
>>> '%s.%03d' % (time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(s)), ms)
'2009-03-08 00:27:31.807'
>>> '{}.{:03d}'.format(time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(s)), ms)
'2009-03-08 00:27:31.807'

2
так, я збирався запропонувати це ... але я гарна відповідь (+1 для збереження мілісекунд на дисплеї :))
Джоран Бізлі

Чудова відповідь також @JoranBeasley і твій теж чудовий :) Дякую хлопці.
доповнення крапками з комою

Зверніть увагу на поділ першої відповіді @falsetru на плаваючу крапку, 1000.0таким чином зберігаючи мілісекунди в даті та часу.
Лоренцо Беллі

Дякую. Саме те, що я шукав
anish

Примітка: fromtimestampочікує int або float. Якщо ви передасте його десяткове число; його поведінка залежить від вашої версії python. Деякі версії python (<= 3,5?) Перетворюються на плаваючі та працюють, як очікувалося. Поки python 3.8 видає попередження і перетворюється на int , відкидаючи будь-які мілісекунди, які ви могли ввести.
Аарон,

18

це мілісекунди, просто розділіть їх на 1000, оскільки gmtime очікує секунд ...

time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(1236472051807/1000.0))

4
Я бачу, але я втрачу мілісекунди правильно ..?
доповнення крапками з комою

1
так ... я думаю, ви можете їх утримати, зробивши timestamp/1000.0 це, передаючи їх десятковим числом ... (хоча я не впевнений, чи можете ви їх отримати)
Джоран Бізлі

чи є еквівалент gmtime, який займає мікро або мілісекунди як вхідні дані?
Рутгер Хофсте

1
seconds == milliseconds/1000... якщо ви введете це у функцію, у вас буде gmtime, який приймає мілісекунди ... мікросекунди, ви просто ділите на 10 ^ 6
Джоран Бізлі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.