Dengan Python, bagaimana Anda mengonversi detik sejak zaman ke objek `datetime`?

248

The timemodul dapat diinisialisasi menggunakan detik sejak zaman:

>>> import time
>>> t1=time.gmtime(1284286794)
>>> t1
time.struct_time(tm_year=2010, tm_mon=9, tm_mday=12, tm_hour=10, tm_min=19, 
                 tm_sec=54, tm_wday=6, tm_yday=255, tm_isdst=0)

Apakah ada cara yang elegan untuk menginisialisasi datetime.datetimeobjek dengan cara yang sama?

Adam Matan
sumber
3
untuk operasi yang berlawanan buka di sini: convert-a-datetime-object-to-seconds
Trevor Boyd Smith

Jawaban:

404

datetime.datetime.fromtimestamp akan dilakukan, jika Anda mengetahui zona waktu, Anda dapat menghasilkan output yang sama dengan time.gmtime

>>> datetime.datetime.fromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 11, 19, 54)

atau

>>> datetime.datetime.utcfromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 10, 19, 54)
SilentGhost
sumber
42
aneh, datetime.utcfromtimestampmembuat cap waktu naif. Saya harus import pytzdan gunakan datetime.fromtimestamp(1423524051, pytz.utc)untuk membuat datetime sadar.
Matt
6
sebagai tindak lanjut ke atas, dengan Python> = 3,2 Anda tidak perlu mengimpor pytzperpustakaan jika Anda hanya ingin cap waktu UTC - Anda hanya perlu from datetime import datetime, timezonedan kemudian menyebutnya sebagai berikut: datetime.fromtimestamp(1423524051, timezone.utc). Ini telah menyimpan perpustakaan ekstra berkali-kali ketika saya hanya membutuhkan zona waktu UTC dari pytz.
phouse512
38

Detik sejak zaman datetimeke strftime:

>>> ts_epoch = 1362301382
>>> ts = datetime.datetime.fromtimestamp(ts_epoch).strftime('%Y-%m-%d %H:%M:%S')
>>> ts
'2013-03-03 01:03:02'
Seganku
sumber
Itu harus datetime.fromtimestamp (1579366345) .ftimeime ('% Y-% m-% d% H:% M:% S')
vml19
26

Dari dokumen, cara yang disarankan untuk mendapatkan objek waktu-sadar datetime dari detik sejak zaman adalah:

Python 3 :

from datetime import datetime, timezone
datetime.fromtimestamp(timestamp, timezone.utc)

Python 2 , menggunakan pytz:

from datetime import datetime
import pytz
datetime.fromtimestamp(timestamp, pytz.utc)
Meistro
sumber
Tautan ke dokumentasi dalam subtitle Anda ("Python 3", "Python 2") akan berguna - dan saya juga merekomendasikan untuk mengubah urutannya.
Adam Matan
Diperbarui. Membiarkan urutan yang sama, karena cocok dengan dokumen Python.
Meistro
Anda tidak pytzhanya perlu mendapatkan utcobjek tzinfo. Sangat mudah untuk membuatnya sendiri
jfs
9

Perhatikan bahwa datetime.datetime. fromtimestamp (timestamp) dan. utcfromtimestamp (timestamp) gagal pada windows untuk tanggal sebelum 1 Januari 1970 sedangkan cap waktu unix negatif tampaknya berfungsi pada platform berbasis unix. Dokumen mengatakan ini:

" Ini dapat meningkatkan ValueError, jika timestamp berada di luar kisaran nilai yang didukung oleh fungsi platform C gmtime (). Biasanya hal ini dibatasi hingga bertahun-tahun pada 1970 hingga 2038 "

Lihat juga Issue1646728

cbare
sumber
: o) ya, masih sekitar 23 tahun untuk memperbaikinya
user3666197
5
Anda bisa menggunakan utc_time = datetime(1970,1,1) + timedelta(seconds=timestamp), untuk mengatasinya.
jfs