Mengonversi string cap waktu unix ke tanggal yang dapat dibaca

826

Saya memiliki string yang mewakili cap waktu unix (yaitu "1284101485") dengan Python, dan saya ingin mengubahnya menjadi tanggal yang dapat dibaca. Ketika saya menggunakan time.strftime, saya mendapatkan 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
sumber
1
tautan ke pertanyaan untuk mengonversi kembali juga: stackoverflow.com/q/19801727/3273031
slushy

Jawaban:

1210

Gunakan datetimemodul:

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'))
Michał Niklas
sumber
131
.fromtimestamp()mungkin gagal untuk tanggal yang lalu jika zona waktu lokal memiliki offset utc yang berbeda. Anda memerlukan basis data zona waktu bersejarah seperti yang disediakan oleh pytzmodul (atau OS Anda). Atau hanya bekerja di UTC dan gunakan .utcfromtimestamp().
jfs
9
@ JFSebastian Anda telah menyebutkan ini mungkin gagal dalam beberapa komentar - tolong bisakah Anda menguraikan mengapa itu akan gagal untuk tanggal / waktu yang lalu? (Dilihat oleh upvotes, banyak orang berdua setuju dengan Anda dan melihat ini sebagai langsung) Tentunya setiap cap waktu unix memiliki tanggal / waktu yang setara?
davidhood2
3
@ davidhood2 mengambil sistem di mana python tidak memiliki akses ke database tz (Windows), atur zona waktu lokal Anda ke zona waktu yang memiliki offset UTC yang berbeda di masa lalu (mis. Eropa / Moskow), panggil daritimestamp () dengan cap waktu dari masa lalu (2011-). Bandingkan hasilnya dengan nilai yang dihitung menggunakan pytz. Jika tidak jelas; ajukan pertanyaan Stack Overflow terpisah.
jfs
3
@ davidhood2: Saya telah memposting jawaban saya sendiri yang menunjukkan pytzsolusinya .
jfs
6
Titik impor adalah ini membutuhkan cap waktu dalam detik sejak zaman; jika Anda memiliki milidetik Anda harus membaginya dengan 1000 karena saya baru tahu.
kata
246
>>> from datetime import datetime
>>> datetime.fromtimestamp(1172969203.1)
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)

Diambil dari http://seehuhn.de/pages/pdate

Daniel
sumber
145

Jawaban yang paling banyak dipilih menyarankan menggunakan fromtimestamp yang rawan kesalahan karena menggunakan zona waktu lokal. Untuk menghindari masalah, pendekatan yang lebih baik adalah menggunakan UTC:

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

Di mana posix_time adalah waktu zaman Posix yang ingin Anda konversi

rkachach
sumber
2
impor 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'
John La Rooy
sumber
10
time.ctime()dan time.localtime()mungkin gagal untuk tanggal yang lalu jika zona waktu lokal memiliki offset utc yang berbeda. Anda memerlukan basis data zona waktu bersejarah seperti yang disediakan oleh pytzmodul (atau OS Anda). Atau hanya bekerja di UTC dan gunakan time.gmtime(). datetimemungkin memberikan rentang tanggal yang lebih luas sehingga datetime.utcfromtimestamp()dapat digunakan alih-alih timefungsi.
jfs
66

Ada dua bagian:

  1. Ubah cap waktu unix ("detik sejak zaman") menjadi waktu lokal
  2. Tampilkan waktu setempat dalam format yang diinginkan.

Cara portabel untuk mendapatkan waktu lokal yang berfungsi walaupun zona waktu lokal memiliki offset utc yang berbeda di masa lalu dan python tidak memiliki akses ke basis data tz adalah dengan menggunakan pytzzona waktu:

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

Untuk menampilkannya, Anda dapat menggunakan format waktu apa pun yang didukung oleh sistem Anda mis:

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

Jika Anda tidak memerlukan waktu lokal, untuk mendapatkan waktu UTC yang dapat dibaca sebagai gantinya:

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

Jika Anda tidak peduli dengan masalah zona waktu yang mungkin memengaruhi tanggal dikembalikan atau apakah python memiliki akses ke database tz di sistem Anda:

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

Pada Python 3, Anda bisa mendapatkan datetime sadar-waktu hanya menggunakan stdlib (offset UTC mungkin salah jika python tidak memiliki akses ke database tz pada sistem Anda misalnya, pada 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)"))

Fungsi dari timemodul adalah pembungkus tipis di sekitar API C yang sesuai dan oleh karena itu mereka mungkin lebih portabel daripada datetimemetode yang sesuai jika tidak, Anda juga dapat menggunakannya:

#!/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
sumber
Itu harus menjadi jawaban yang paling banyak dipilih jika Anda peduli dengan waktu setempat.
azzamsa
36

Untuk stempel waktu yang dapat dibaca manusia dari stempel waktu UNIX, saya telah menggunakan ini dalam skrip sebelumnya:

import os, datetime

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

Keluaran:

'26 Desember 2012'

Jared Burrows
sumber
25

Anda dapat mengonversi waktu saat ini seperti ini

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

Untuk mengonversi tanggal dalam string ke format yang berbeda.

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
Nick
sumber
24

Selain menggunakan paket waktu / waktu , panda juga dapat digunakan untuk menyelesaikan masalah yang sama. Berikut adalah cara kami menggunakan panda untuk mengonversi stempel waktu ke tanggal yang dapat dibaca :

Stempel waktu dapat dalam dua format:

  1. 13 digit (milidetik) - Untuk mengonversi milidetik hingga saat ini, gunakan:

    import pandas
    result_ms=pandas.to_datetime('1493530261000',unit='ms')
    str(result_ms)
    
    Output: '2017-04-30 05:31:01'
  2. 10 digit (detik) - Untuk mengonversi detik ke tanggal, gunakan:

    import pandas
    result_s=pandas.to_datetime('1493530261',unit='s')
    str(result_s)
    
    Output: '2017-04-30 05:31:01'
Shubham
sumber
Kemenangan lain untuk panda tampaknya - modul ini fantastis dalam segala hal
Vaidøtas Ivøška
21
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')

Dapatkan tanggal yang dapat dibaca dari timestamp dengan waktu juga, Anda juga dapat mengubah format tanggal.

Rishabh Jhalani
sumber
5
Apa yang ditambahkan jawaban ini ke jawaban ini ?
kocica
1
Harap tambahkan peringatan terkait dengan masalah asumsi zona waktu lokal. Praktik terbaik dalam pemrograman adalah menyimpan cap waktu sebagai waktu UTC bukan cap waktu lokal. Tetapi contoh di atas akan mengembalikan waktu yang salah jika zona waktu lokal bukan UTC.
Timothy C. Quinn
21

Dengan Python 3.6+:

import datetime

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

Keluaran:

2020-01-15 19:51:41

Penjelasan:

Contango
sumber
Jawaban yang bagus, tetapi mengapa Anda menunjukkan bagaimana Anda dapat menyimpan tanggal ke string, dan tidak hanya mencetaknya: value.strftime ('% Y-% m-% d% H:% M:% S')
bjornasm
6
import datetime
temp = datetime.datetime.fromtimestamp(1386181800).strftime('%Y-%m-%d %H:%M:%S')
print temp
itsaruns
sumber
6

Cara lain ini dapat dilakukan menggunakan fungsi gmtime dan format;

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

Keluaran: 2018-10-4 11:57:44

h3xus
sumber
1

saya baru saja berhasil menggunakan:

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

satu liner cepat dan kotor:

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

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

eqzx
sumber
3
Atau lebih singkatnya: '-'. Join (peta (str, datetime.datetime.now (). Timetuple () [: 6]))
Jelle Zijlstra
2
@JelleZijlstra Eh, saya lebih suka ekspresi generator daripada peta.
crhodes
4
Format tanggal seperti apa '2013-5-5-1-9-43'? Saya belum pernah melihat format ini di mana pun sebagai representasi tanggal / waktu yang valid.
madoki
dapatkah Anda menguraikan apa yang memenuhi syarat ini sebagai representasi yang tidak valid @madoki? maksudmu tidak standar Keuntungan utama yang dimilikinya atas sebagian besar jawaban lainnya adalah kemampuan untuk memasukkannya dalam jalur file atau direktori, karena spasi dan titik dua tidak berada dalam kumpulan karakter direktori unix standar. lihat misalnya stackoverflow.com/a/458001/209246
eqzx
0

Anda dapat menggunakan easy_date untuk membuatnya mudah:

import date_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")
Raphael Amoedo
sumber
5
Setiap pemrograman memiliki pengubah tanggal dan waktu sendiri. Seseorang seharusnya tidak perlu menggunakan mods / frameworks untuk ini
JosFabre
strptimedan strftimetidak intuitif ... Dan bahkan tidak dapat dibaca ... Tapi saya mengerti dan menghargai pendapat Anda
Raphael Amoedo
4
Bahwa seseorang harus "tidak harus menggunakan" itu salah. Itu tergantung pada bahasa dan kualitas lib bawaan. Javascript memiliki moments.js dan Java memiliki waktu Joda yang keduanya lebih populer daripada masing-masing utilities konversi tanggal dan waktu yang ada (sehingga waktu Joda kemudian memengaruhi lib standar Java yang diperbarui). Yang mengatakan, kecuali pertanyaan itu meminta perpustakaan pihak ketiga yang bagus, lebih baik memberikan jawaban berdasarkan perpustakaan standar.
Hejazzman
Saya berdiri dikoreksi @NikosVentouras. Saya baru saja mengalami masalah "Tanggal JS di IE berperilaku berbeda" untuk pertama kalinya. Jadi saya akhirnya menggunakan moment.js
JosFabre