Unix zaman damgası dizesini okunabilir tarihe dönüştürme


825

Python bir unix zaman damgasını (yani "1284101485") temsil eden bir dize var ve okunabilir bir tarihe dönüştürmek istiyorum. Kullandığımda time.strftime, bir 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
geri dönüşümü için soru bağlantısı: stackoverflow.com/q/19801727/3273031
slushy

Yanıtlar:


1210

datetimeModülü kullan :

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()yerel bir saat diliminin farklı utc uzaklığı varsa geçmiş tarihler için başarısız olabilir. pytzModül (veya işletim sisteminiz) tarafından sağlanan gibi tarihi bir saat dilimi veritabanına ihtiyacınız vardır . Ya da sadece UTC'de çalışın ve kullanın .utcfromtimestamp().
jfs

9
@JFSebastian Bunun birkaç yorumda başarısız olabileceğini belirttiniz - lütfen neden geçmiş tarihler / saatler için başarısız olacağını açıklayabilir misiniz? (Upvotes değerlendirildiğinde, birçok kişi hem sizinle hemfikir ve bunu basit olarak görüyor) Kesinlikle herhangi bir unix zaman damgasının basit bir eşdeğer tarih / saati var mı?
16:16

3
@ davidhood2, python'un tz veritabanına erişemediği bir sistem alır (Windows), yerel saat diliminizi geçmişte farklı bir UTC ofsetine sahip bir saat dilimine ayarlayın (örneğin, Avrupa / Moskova), geçmişten zaman damgaları ile fromtimestamp () çağırın (2011-). Sonuçları kullanarak hesaplanan değerlerle karşılaştırın pytz. Net değilse; ayrı bir Yığın Taşması sorusu sorun.
jfs

3
@ davidhood2: Yayınladığım gösteriyor kendi cevap pytzçözümünü .
jfs

6
Bir içe aktarma noktası, bu çağdan beri saniye cinsinden bir zaman damgası alır; Milisaniyeniz varsa, yeni öğrendiğim gibi 1000'e bölmeniz gerekir.
wordsforthewise


145

En çok oy verilen cevap, yerel saat dilimini kullandığı için hataya açık olan fromtimestamp kullanılmasını önermektedir. Sorunları önlemek için daha iyi bir yaklaşım UTC kullanmaktır:

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

Posix_time, dönüştürmek istediğiniz Posix dönemidir


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()ve time.localtime()yerel bir saat diliminin farklı utc uzaklığı varsa geçmiş tarihler için başarısız olabilir. pytzModül (veya işletim sisteminiz) tarafından sağlanan gibi tarihi bir saat dilimi veritabanına ihtiyacınız vardır . Ya da sadece UTC'de çalışın ve kullanın time.gmtime(). datetimedaha geniş tarih aralığı sağlayabilir, bu nedenle işlevler datetime.utcfromtimestamp()yerine kullanılabilir time.
jfs

66

İki bölüm vardır:

  1. Unix zaman damgasını ("dönemin ardından saniye") yerel saate dönüştürün
  2. Yerel saati istediğiniz formatta görüntüleyin.

Yerel saat dilimi geçmişte farklı bir utc ofseti olsa ve python'un tz veritabanına erişimi olmasa bile çalışan yerel saati almanın taşınabilir bir yolu bir pytzsaat dilimi kullanmaktır :

#!/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)

Görüntülemek için sisteminiz tarafından desteklenen herhangi bir saat biçimini kullanabilirsiniz, örneğin:

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

Yerel bir saate ihtiyacınız yoksa, okunabilir bir UTC saati almak için:

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

Hangi tarihin döndürüleceğini etkileyebilecek saat dilimi sorunlarıyla ilgilenmiyorsanız veya python'un sisteminizdeki tz veritabanına erişimi varsa:

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

Python 3'te, yalnızca stdlib kullanarak saat dilimi kullanan bir tarih saati alabilirsiniz (python'un sisteminizdeki tz veritabanına (örneğin Windows'ta) erişimi yoksa UTC ofseti yanlış olabilir):

#!/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)"))

timeModülün işlevleri , karşılık gelen C API'sinin etrafındaki ince sargılardır ve bu nedenle ilgili datetimeyöntemlerden daha az taşınabilir olabilirler, aksi takdirde bunları da kullanabilirsiniz:

#!/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))  

Yerel saati önemsiyorsanız en çok oy alan cevap olmalıdır.
azzamsa

36

UNIX zaman damgasından okunabilir bir zaman damgası için bunu daha önce komut dosyalarında kullandım:

import os, datetime

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

Çıktı:

'26 Aralık 2012'


25

Geçerli saati şu şekilde dönüştürebilirsiniz

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

Dizedeki bir tarihi farklı biçimlere dönüştürmek için.

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

Kullanarak dışında zaman / tarih saat paketi, pandalar da aynı problem.Here kullanabileceğimiz nasıl çözmek için kullanılabilecek pandaların dönüştürme için zaman damgası ile okunabilir tarih :

Zaman damgaları iki biçimde olabilir:

  1. 13 basamak (milisaniye) - Milisaniyeyi tarihe dönüştürmek için şunu kullanın:

    import pandas
    result_ms=pandas.to_datetime('1493530261000',unit='ms')
    str(result_ms)
    
    Output: '2017-04-30 05:31:01'
  2. 10 basamak (saniye) - Saniyeleri tarihe dönüştürmek için şunu kullanın:

    import pandas
    result_s=pandas.to_datetime('1493530261',unit='s')
    str(result_s)
    
    Output: '2017-04-30 05:31:01'

Pandalar için başka bir galibiyet görünüyor - modül her şeyde harika
Vaidøtas Ivøška

21
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')

Zaman damgasından okunabilir tarihi saatle de alın, ayrıca tarihin biçimini de değiştirebilirsiniz.


5
Bu cevap ne eklese bu cevap?
kocica

1
Lütfen yerel saat dilimi varsayımı ile ilgili bir uyarı ekleyin. Programlamadaki en iyi uygulamalar, zaman damgalarını yerel zaman damgaları yerine UTC zamanları olarak saklamaktır. Ancak yerel saat dilimi UTC değilse yukarıdaki örnek yanlış saati döndürür.
Timothy C. Quinn

20

Python 3.6 ve üzeri sürümlerde:

import datetime

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

Çıktı:

2020-01-15 19:51:41

Açıklama:


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

6

Bunun gmtime ve format işlevi kullanılarak yapılabilmesi için başka bir yol;

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

Çıktı: 2018-10-4 11:57:44


1

sadece başarıyla kullandım:

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

0

hızlı ve kirli bir astar:

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

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


3
Veya daha kısaca: '-'. Katılmak (harita (str, datetime.datetime.now (). Timetuple () [: 6])))
Jelle Zijlstra

2
@JelleZijlstra Eh, harita üzerinde jeneratör ifadesini tercih ederim.
crhodes

4
'2013-5-5-1-9-43' tarih biçimi nedir? Bu formatı daha önce hiçbir yerde geçerli bir tarih / saat temsili olarak görmedim.
madoki

bunu geçersiz bir temsil @madoki olarak niteleyen şeyleri açıklayabilir misiniz? standart dışı mı demek istiyorsun? Diğer yanıtların çoğuna göre birincil avantajı, boşluklar ve iki nokta üst üste standart dizin karakterleri kümesinde olmadığı için bir dosyaya veya dizin yoluna ekleme yeteneğidir. bkz. örneğin stackoverflow.com/a/458001/209246
eqzx

0

Kolaylaştırmak için easy_date komutunu kullanabilirsiniz :

import date_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")

5
Her programlamanın kendi tarih ve saat dönüştürücüleri vardır. Bunun için mod / çerçeve kullanmak zorunda
kalmamalı

strptimeve strftimesezgisel değil ... Ve hatta okunamıyor ... Ama fikrinizi anlıyorum ve saygı duyuyorum
Raphael Amoedo

4
"Asla kullanmak zorunda kalmamak" yanlıştır. Yerleşik kütüphanelerin diline ve kalitesine bağlıdır. Javascript moments.js'ye sahiptir ve Java, her ikisi de ilgili tarih ve saat dönüştürme araçlarından daha popüler olan Joda zamanına sahiptir (Joda zamanı daha sonra Java 8'in güncellenmiş standart kütüphanelerini etkilemiştir). Bununla birlikte, soru güzel üçüncü taraf kütüphaneleri gerektirmedikçe, standart kütüphaneye dayalı bir cevap vermek tercih edilir.
Hejazzman

Düzeltildi @NikosVentouras. Ben sadece ilk kez "IE JS Tarihi farklı davranıyor" sorunu yaşadım. Bu yüzden moment.js'yi kullandım
JosFabre
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.