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