Преобразование строки метки времени Unix в читаемую дату

827

У меня есть строка, представляющая метку времени 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
VeryNewToPython
источник
1
ссылка на вопрос для обратного преобразования тоже: stackoverflow.com/q/19801727/3273031
слякотный

Ответы:

1211

Используйте 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'))
Михал Никлас
источник
131
.fromtimestamp()может потерпеть неудачу в прошлые даты, если местный часовой пояс имеет другое смещение utc. Вам нужна историческая база данных о часовых поясах, например, предоставленная pytzмодулем (или вашей ОС). Или просто работать в UTC и использовать .utcfromtimestamp().
JFS
9
@JFSebastian Вы упомянули, что это может не сработать в нескольких комментариях - пожалуйста, не могли бы вы объяснить, почему это не сработало в прошлые даты / времена? (Судя по откровенным голосам, многие люди согласны с вами и считают это простым). Конечно, у любой метки времени Unix есть простая эквивалентная дата / время?
davidhood2
3
@ davidhood2 возьмите систему, в которой python не имеет доступа к базе данных tz (Windows), задайте для своего локального часового пояса часовой пояс, который имел другое смещение UTC в прошлом (например, Европа / Москва), вызовите fromtimestamp () с временными метками из прошлого (2011-). Сравните результаты со значениями, рассчитанными с использованием pytz. Если неясно; задать отдельный вопрос переполнения стека.
JFS
6
Точка импорта - это отметка времени в секундах с начала эпохи; если у вас есть миллисекунды, вы должны разделить на 1000, как я только что узнал.
словами
145

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

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

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

rkachach
источник
2
импорт datetime, pytz datetime.datetime (1990, 1, 1, tzinfo = pytz.utc)
y.selivonchyk
76
>>> 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'
Джон Ла Рой
источник
10
time.ctime()и time.localtime()может потерпеть неудачу для прошлых дат, если местный часовой пояс имеет другое смещение utc. Вам нужна историческая база данных о часовых поясах, например, предоставленная pytzмодулем (или вашей ОС). Или просто работать в UTC и использовать time.gmtime(). datetimeможет обеспечить более широкий диапазон дат, поэтому datetime.utcfromtimestamp()может использоваться вместо timeфункций.
JFS
66

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

  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 в вашей системе:

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))  
JFS
источник
Это должен быть самый голосующий ответ, если вы заботитесь о местном времени.
Аззамса
36

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

import os, datetime

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

Вывод:

26 декабря 2012 г.

Джаред Барроуз
источник
25

Вы можете конвертировать текущее время, как это

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
Ник
источник
24

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

Метки времени могут быть в двух форматах:

  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'
Shubham
источник
Кажется, еще одна победа панд - модуль просто фантастический
Vaidøtas Ivøška
21
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')

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

Ришабх Джалани
источник
5
Что этот ответ добавляет к этому ответу?
kocica
1
Пожалуйста, добавьте предупреждение, связанное с проблемой предположения о местном часовом поясе. Лучшие практики в программировании - хранить метки времени как время UTC вместо локальных меток времени. Но этот пример выше вернет неправильное время, если местный часовой пояс не UTC.
Тимоти К. Куинн
21

В Python 3.6+:

import datetime

timestamp = 1579117901
value = datetime.datetime.fromtimestamp(timestamp)
print(f"{value:%Y-%m-%d %H:%M:%S}")

Вывод

2020-01-15 19:51:41

объяснение

бонус

Чтобы сохранить дату в строку, а затем распечатать ее, используйте это:

my_date = f"{value:%Y-%m-%d %H:%M:%S}"
print(my_date)
Контанго
источник
Отличный ответ, но вы показали, как можно сохранить дату в строку, а не просто напечатать ее: value.strftime ('% Y-% m-% d% H:% M:% S')
bjornasm
@bjornasm Конечно, обновленный ответ с подобным методом для достижения этой цели.
Contango
6
import datetime
temp = datetime.datetime.fromtimestamp(1386181800).strftime('%Y-%m-%d %H:%M:%S')
print temp
itsaruns
источник
6

Другой способ сделать это можно с помощью функции gmtime и format;

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

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

h3xus
источник
1

я просто успешно использовал:

>>> type(tstamp)
pandas.tslib.Timestamp
>>> newDt = tstamp.date()
>>> type(newDt)
datetime.date
nimmy
источник
0

быстрый и грязный лайнер:

'-'.join(str(x) for x in list(tuple(datetime.datetime.now().timetuple())[:6]))

'2013-5-5-1-9-43'

eqzx
источник
3
Или более кратко: '-'. Join (map (str, datetime.datetime.now (). Timetuple () [: 6]))
Jelle Zijlstra
2
@JelleZijlstra Да, я предпочитаю выражение генератора, а не карту.
crhodes
4
Какой формат даты «2013-5-5-1-9-43»? Я нигде не видел этот формат в качестве действительного представления даты / времени.
Madoki
Можете ли вы уточнить, что квалифицирует это как недопустимое представление @madoki? Вы имеете в виду нестандарт? Основное преимущество, которое он имеет перед большинством других ответов, - это возможность включить его в путь к файлу или каталогу, поскольку пробелы и двоеточия не входят в набор стандартных символов каталога Unix. см., например, stackoverflow.com/a/458001/209246
eqzx
0

Вы можете использовать easy_date, чтобы сделать это легко:

import date_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")
Рафаэль Амоедо
источник
5
Каждое программирование имеет свои собственные конвертеры даты и времени. Никогда не нужно использовать моды / рамки для этого
JosFabre
strptimeи strftimeне интуитивно понятный ... и даже не читаемый ... Но я понимаю и уважаю ваше мнение
Рафаэль Амоедо
4
То, что нужно «никогда не использовать», неправильно. Это зависит от языка и качества встроенных библиотек. В Javascript есть моменты .js, а в Java - время Joda, которое более популярно, чем соответствующие встроенные утилиты преобразования даты и времени (настолько, что время Joda позже повлияло на обновленные стандартные библиотеки Java 8). Тем не менее, если вопрос не требует хороших сторонних библиотек, предпочтительно дать ответ на основе стандартной библиотеки.
Hejazzman 22.12.15
Я исправлен @NikosVentouras. Я только что впервые столкнулся с проблемой "JS Date in IE ведет себя по-другому". Так что в итоге я использовал moment.js
JosFabre