Перетворення рядка часової позначки Unix в читану дату


825

У мене є рядок, що представляє часову позначку 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
slushy

Відповіді:


1209

Використовувати 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

Найбільш голосована відповідь пропонує використовувати timettamp, який схильний до помилок, оскільки він використовує локальний часовий пояс. Щоб уникнути проблем, кращим підходом є використання UTC:

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

Де posix_time - час епохи Posix, який ви хочете перетворити


2
import 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()може не вдатися до минулих дат, якщо місцевий часовий пояс змістив різну точність. Вам потрібна історична база даних часового поясу, така як надана 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модуля - це тонкі обгортки навколо відповідного API 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))  

Це має бути найбільш голосовою відповіддю, якщо ви дбаєте про місцевий час.
azzamsa

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

Окрім використання пакету time / datetime , панди також можуть бути використані для вирішення тієї ж проблеми. Ось як ми можемо використовувати панди для перетворення часових позначок у читану дату :

Мітки часу можуть бути у двох форматах:

  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.
Тімоті К. Квін

20

У 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

Пояснення:


6
import datetime
temp = datetime.datetime.fromtimestamp(1386181800).strftime('%Y-%m-%d %H:%M:%S')
print temp

6

Інший спосіб, що це можна зробити за допомогою функції gmtime та форматування;

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 (карта (str, datetime.datetime.now (). Timetuple () [: 6]))
Jelle Zijlstra

2
@JelleZijlstra Е, я більше віддаю перевагу вираженню генератора над картою.
кроди

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 є moments.js, а в Java був час Joda, який обидва популярніші, ніж відповідні вбудовані утиліти перетворення дати та часу (настільки, що час Joda вплинув на оновлені стандартні лісти Java 8). Однак, якщо питання не вимагає приємних сторонніх бібліотек, бажано дати відповідь на основі стандартної бібліотеки.
Hejazzman

Я виправлений @NikosVentouras. У мене вперше вийшло питання "Дата JS в IE поводиться інакше". Тому я закінчив використовувати moment.js
JosFabre
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.