Преобразование строки метки времени 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

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, которое вы хотите преобразовать


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

Это должен быть самый голосующий ответ, если вы заботитесь о местном времени.
Аззамса

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'

Кажется, еще одна победа панд - модуль просто фантастический
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

6

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

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

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


1

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

>>> type(tstamp)
pandas.tslib.Timestamp
>>> newDt = tstamp.date()
>>> type(newDt)
datetime.date

0

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

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

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


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