Преобразование строки метки времени Unix в читаемую дату - PullRequest
718 голосов
/ 10 сентября 2010

У меня есть строка, представляющая метку времени Unix (т.е. "1284101485") в Python, и я хотел бы преобразовать ее в удобочитаемую дату.Когда я использую time.strftime, я получаю TypeError:

>>>import time
>>>print time.strftime("%B %d %Y", "1284101485")

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument must be 9-item sequence, not str

Ответы [ 14 ]

1073 голосов
/ 10 сентября 2010

Использовать datetime модуль:

from datetime import datetime
ts = int("1284101485")

# if you encounter a "year is out of range" error the timestamp
# may be in milliseconds, try `ts /= 1000` in that case
print(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))
213 голосов
/ 10 сентября 2010
>>> from datetime import datetime
>>> datetime.fromtimestamp(1172969203.1)
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)

Взято из http://seehuhn.de/pages/pdate

140 голосов
/ 12 мая 2016

В ответе с наибольшим количеством голосов предлагается использовать метку времени, которая подвержена ошибкам, поскольку использует местный часовой пояс. Чтобы избежать проблем, лучше использовать UTC:

datetime.datetime.utcfromtimestamp(posix_time).strftime('%Y-%m-%dT%H:%M:%SZ')

Где posix_time - время эпохи Posix, которое вы хотите преобразовать

71 голосов
/ 10 сентября 2010
>>> import time
>>> time.ctime(int("1284101485"))
'Fri Sep 10 16:51:25 2010'
>>> time.strftime("%D %H:%M", time.localtime(int("1284101485")))
'09/10/10 16:51'
56 голосов
/ 23 ноября 2016

Есть две части:

  1. Преобразование метки времени unix («секунды с начала эпохи») в местное время
  2. Отображение местного времени в нужном формате.

Переносимый способ получения местного времени, который работает, даже если в прошлом местный часовой пояс имел другое смещение utc, а python не имеет доступа к базе данных tz, - это использовать pytz часовой пояс:

#!/usr/bin/env python
from datetime import datetime
import tzlocal  # $ pip install tzlocal

unix_timestamp = float("1284101485")
local_timezone = tzlocal.get_localzone() # get pytz timezone
local_time = datetime.fromtimestamp(unix_timestamp, local_timezone)

Чтобы отобразить его, вы можете использовать любой формат времени, поддерживаемый вашей системой, например:

print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))
print(local_time.strftime("%B %d %Y"))  # print date in your format

Если вам не нужно местное время, чтобы получить читабельноеВместо этого время UTC:

utc_time = datetime.utcfromtimestamp(unix_timestamp)
print(utc_time.strftime("%Y-%m-%d %H:%M:%S.%f+00:00 (UTC)"))

Если вас не волнуют проблемы с часовым поясом, которые могут повлиять на , какая дата возвращается или если Python имеет доступ к базе данных tz на вашем компьютереsystem:

local_time = datetime.fromtimestamp(unix_timestamp)
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f"))

В Python 3 вы можете получить дату и время с учетом часового пояса, используя только stdlib (смещение UTC может быть неправильным, если у python нет доступа к базе данных tz в вашей системе, например, в Windows):

#!/usr/bin/env python3
from datetime import datetime, timezone

utc_time = datetime.fromtimestamp(unix_timestamp, timezone.utc)
local_time = utc_time.astimezone()
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))

Функции из time модуляЭто тонкие обертки вокруг соответствующего C API, и поэтому они могут быть менее переносимыми, чем соответствующие datetime методы, в противном случае вы также можете использовать их:

#!/usr/bin/env python
import time

unix_timestamp  = int("1284101485")
utc_time = time.gmtime(unix_timestamp)
local_time = time.localtime(unix_timestamp)
print(time.strftime("%Y-%m-%d %H:%M:%S", local_time)) 
print(time.strftime("%Y-%m-%d %H:%M:%S+00:00 (UTC)", utc_time))  
34 голосов
/ 27 декабря 2012

Для удобочитаемой отметки времени из отметки времени UNIX я использовал ее в сценариях ранее:

import os, datetime

datetime.datetime.fromtimestamp(float(os.path.getmtime("FILE"))).strftime("%B %d, %Y")

Вывод:

'26 декабря 2012 г.'

24 голосов
/ 07 марта 2012

Вы можете конвертировать текущее время следующим образом

t=datetime.fromtimestamp(time.time())
t.strftime('%Y-%m-%d')
'2012-03-07'

Для преобразования даты в строке в разные форматы.

import datetime,time

def createDateObject(str_date,strFormat="%Y-%m-%d"):    
    timeStamp = time.mktime(time.strptime(str_date,strFormat))
    return datetime.datetime.fromtimestamp(timeStamp)

def FormatDate(objectDate,strFormat="%Y-%m-%d"):
    return objectDate.strftime(strFormat)

Usage
=====
o=createDateObject('2013-03-03')
print FormatDate(o,'%d-%m-%Y')

Output 03-03-2013
18 голосов
/ 07 марта 2018

Кроме использования пакета время / дата / время , панды также можно использовать для решения той же проблемы. Вот как мы можем использовать панды для преобразования отметка времени до читаемая дата :

Отметки времени могут иметь два формата:

  1. 13 цифр (миллисекунд) - для преобразования миллисекунд до даты, используйте:

    import pandas
    result_ms=pandas.to_datetime('1493530261000',unit='ms')
    str(result_ms)
    
    Output: '2017-04-30 05:31:01'
    
  2. 10 цифр (секунд) - для преобразования секунд в дату используйте:

    import pandas
    result_s=pandas.to_datetime('1493530261',unit='s')
    str(result_s)
    
    Output: '2017-04-30 05:31:01'
    
9 голосов
/ 16 августа 2018
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')

Получить читаемую дату из отметки времени вместе со временем, также вы можете изменить формат даты.

4 голосов
/ 21 января 2019

Другой способ сделать это, используя gmtime и функцию форматирования;

from time import gmtime
print('{}-{}-{} {}:{}:{}'.format(*gmtime(1538654264.703337)))

Вывод: 2018-10-4 11:57:44

...