Apakah time.time Python () mengembalikan stempel waktu lokal atau UTC?

562

Apakah time.time()dalam modul waktu Python mengembalikan waktu sistem atau waktu dalam UTC?

Saransh Mohapatra
sumber
87
Stempel waktu tidak memiliki zona waktu. Mereka mewakili beberapa detik sejak zaman. Zaman adalah saat tertentu dalam waktu yang tidak bergantung pada zona waktu.
jwg
2
@ jwg: stempel waktu POSIX yang umum digunakan tidak menghitung detik kabisat dan oleh karena itu mereka bukan "jumlah [SI yang berlalu] detik sejak zaman" (mereka sudah dekat).
jfs
7
Saya tidak berpikir ini adalah keberatan akurat @ JFSebastian. Detik kabisat bukan 'detik berlalu sejak zaman'. Mereka adalah perubahan dalam representasi waktu yang direkam oleh jam yang tidak sesuai dengan detik yang berlalu.
jwg
4
@ JFSebastian Maaf atas kebingungannya. Leap detik bukan 'detik berlalu'. Oleh karena itu cap waktu, yang merupakan 'jumlah detik yang berlalu', tidak dan tidak boleh termasuk detik kabisat.
jwg
2
@ jwg salah. Anda tidak dapat menghapus waktu fisik. Stempel waktu POSIX bukan jumlah SI yang telah berlalu. Berikut ini sebuah contoh: 3 detik berlalu antara "31 Desember 2016 pada 6:59:59 pm" dan "31 Desember 2016 pada 7:00:01 pm" di New York tetapi perbedaan dalam cap waktu POSIX yang sesuai hanya 2 detik ( lompatan kedua tidak dihitung).
jfs

Jawaban:

781

The time.time()fungsi mengembalikan jumlah detik sejak zaman, seperti detik. Perhatikan bahwa "zaman" didefinisikan sebagai awal 1 Januari 1970 dalam UTC. Jadi zaman didefinisikan dalam istilah UTC dan menetapkan momen global dalam waktu. Tidak peduli di mana Anda berada "detik masa lalu" (time.time ()) mengembalikan nilai yang sama pada saat yang sama.

Berikut adalah beberapa contoh output yang saya jalankan di komputer saya, mengubahnya menjadi string juga.

Python 2.7.3 (default, Apr 24 2012, 00:00:54) 
[GCC 4.7.0 20120414 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> ts = time.time()
>>> print ts
1355563265.81
>>> import datetime
>>> st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
>>> print st
2012-12-15 01:21:05
>>>

The tsvariabel adalah waktu kembali dalam hitungan detik. Saya kemudian mengonversinya menjadi string menggunakan datetimeperpustakaan menjadikannya string yang dapat dibaca manusia.

squiguy
sumber
72
Mengapa kita harus import timeketika datetime pada dasarnya memberi Anda cap waktu. Hapus milidetik -str(datetime.datetime.now()).split('.')[0]
Hussain
17
@Alexis Unix zaman didefinisikan dengan sangat jelas di sini . Itu bahkan menunjukkan contoh Python cara turun halaman. Saya tidak mengerti komentar Anda.
squiguy
9
@ Squiguy jujur ​​saja, saya tidak ingat apa yang membuat saya mengatakan itu. Saya pasti salah membaca sesuatu, dan saya berjuang untuk menemukan mengapa beberapa tes gagal ketika saya pindah antara Prancis dan AS untuk akhirnya menemukan bahwa masalahnya adalah karena DST yang membuat minggu lebih lama dalam periode tahun ini. Maaf tentang itu dan terima kasih telah menunjukkan ini.
Alexis
5
ini bukan "detik dalam UTC." . Stempel waktu yang dikembalikan oleh time.time()tidak di zona waktu apa pun . "detik sejak zaman" adalah sebuah istilah; itu tidak berlalu detik sejak beberapa titik waktu (zaman). Anda dapat mengonversinya ke waktu lokal Anda (dengan basis data tz) dan / atau zona waktu UTC dengan mudah. btw, jika Anda menjatuhkan .strftime()hasilnya (hampir) sama (+/- mikrodetik).
jfs
3
baru saja mengujinya, time.time () tidak memberikan waktu UTC, itu memberikan waktu zona lokal saya
sliders_alpha
302

Ini untuk bentuk teks cap waktu yang dapat digunakan dalam file teks Anda. (Judul pertanyaan di masa lalu berbeda, sehingga pengantar untuk jawaban ini diubah untuk memperjelas bagaimana itu dapat ditafsirkan sebagai waktu. [Diperbarui 2016-01-14])

Anda bisa mendapatkan cap waktu sebagai string menggunakan .now()atau .utcnow()dari datetime.datetime:

>>> import datetime
>>> print datetime.datetime.utcnow()
2012-12-15 10:14:51.898000

The nowberbeda dari utcnowseperti yang diharapkan - jika mereka bekerja dengan cara yang sama:

>>> print datetime.datetime.now()
2012-12-15 11:15:09.205000

Anda dapat merender timestamp ke string secara eksplisit:

>>> str(datetime.datetime.now())
'2012-12-15 11:15:24.984000'

Atau Anda bisa lebih eksplisit untuk memformat stempel waktu sesuai keinginan:

>>> datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M%p")
'Saturday, 15. December 2012 11:19AM'

Jika Anda menginginkan format ISO, gunakan .isoformat()metode objek:

>>> datetime.datetime.now().isoformat()
'2013-11-18T08:18:31.809000'

Anda dapat menggunakan ini dalam variabel untuk penghitungan dan pencetakan tanpa konversi.

>>> ts = datetime.datetime.now()
>>> tf = datetime.datetime.now()
>>> te = tf - ts
>>> print ts
2015-04-21 12:02:19.209915
>>> print tf
2015-04-21 12:02:30.449895
>>> print te
0:00:11.239980
semangat
sumber
1
Saya ingin waktu zaman .... tidak dalam format tanggal ... seperti terbukti dari penyebutan saya tentang time.time perintah ()
Saransh Mohapatra
34
OK tidak masalah. Orang lain mungkin perlu timestamp mengatakan untuk menempatkan dalam file teks.
pepr
1
Saya satu lagi, dialihkan ke sini kemungkinan karena jumlah upvotes yang tidak masuk akal . Pertanyaannya adalah cacat dan jawaban yang diterima menyesatkan untuk kebutuhan khas: mendapatkan akhiran yang dapat dibaca manusia - katakan untuk nama file - di zona waktu server yang paling sering digunakan.
Untuk mencetak stempel waktu sebagai bagian dari string, gunakan ini: Python2: import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
Mr-IDE
datetime.datetime.utcnow()itu jahat. Ini menciptakan datetime naif yang bukan waktu setempat. Kecuali waktu lokal Anda UTC, itu akan SALAH. Gunakan datetime.datetime.now(datetime.timezone.utc)sebagai gantinya. Ini menciptakan waktu sadar zona waktu mewakili waktu saat ini.
Terrel Shumway
139

Berdasarkan jawaban dari #squiguy, untuk mendapatkan stempel waktu yang benar, saya akan mengetikkan cast dari float.

>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318

Setidaknya begitulah konsepnya.

Rudi Strydom
sumber
1
Apa alasan untuk mengetikkan cap waktu? Apa jenisnya secara default?
Tizzee
3
@ Tyneee type(time.time())memberi<type 'float'>
famousgarkin
4
Tetapi jika Anda membutuhkan waktu yang lebih tepat daripada dalam hitungan detik, float itu masuk akal.
pepr
3
@RudiStrydom: Python diketik dengan kuat. Jangan bingung dengan diketik secara statis.
jfs
1
@CheokYanCheng: int()bersifat polimorfik. Ini akan kembali longjika perlu pada versi Python lama - semua bilangan bulat lama pada versi Python baru.
jfs
30

Jawabannya bisa tidak keduanya atau keduanya.

  • tidak satu pun: time.time()mengembalikan kira-kira jumlah detik yang berlalu sejak Zaman. Hasilnya tidak tergantung pada zona waktu sehingga bukan UTC atau waktu setempat. Inilah definisi POSIX untuk "Detik Sejak Zaman" .

  • keduanya: time.time()tidak memerlukan jam sistem Anda untuk disinkronkan sehingga mencerminkan nilainya (meskipun tidak ada hubungannya dengan zona waktu lokal). Komputer yang berbeda mungkin mendapatkan hasil yang berbeda secara bersamaan. Di sisi lain jika waktu komputer Anda adalah disinkronisasi maka mudah untuk mendapatkan waktu UTC dari cap waktu (jika kita mengabaikan detik kabisat):

    from datetime import datetime
    
    utc_dt = datetime.utcfromtimestamp(timestamp)

Tentang cara mendapatkan cap waktu dari waktu UTC dalam berbagai versi Python, lihat Bagaimana saya bisa mendapatkan tanggal yang dikonversi menjadi detik sejak zaman menurut UTC?

jfs
sumber
4
Ini adalah satu-satunya jawaban yang menyebutkan dengan benar datetime.utcfromtimestampsementara ada 308 upvotes pada jawaban dengan datetime.fromtimestamp:-(
@TerrelShumway pertanyaannya adalah tentang apa time.time()fungsi kembali (sangat singkat). Komentar Anda membahas beberapa pertanyaan lain (Anda telah mengubah komentar Anda sejak saya mulai menjawabnya. Yang lebih buruk). Catatan tambahan; kata "benar" harus digunakan dengan hemat (zona waktu rumit — tidak ada peluru perak — hanya pertukaran untuk kasus penggunaan tertentu).
jfs
Jangan gunakan datetime.datetime.utcfromtimestamp(ts). Kecuali jika waktu lokal Anda adalah UTC, itu akan SALAH, karena itu menciptakan waktu naif yang bukan waktu setempat. Gunakan datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)sebagai gantinya. Ini menciptakan waktu sadar zona waktu yang mewakili instan yang sama seperti cap waktu.
Terrel Shumway
Iya. Komentar saya sebelumnya salah besar. Sebagian besar kode dalam modul datetime memperlakukan data naif sebagai waktu lokal. Menggunakan datetimes naif seperti membuka file teks tanpa mengetahui pengkodeannya.
Terrel Shumway
@TerrelShumway Adalah salah untuk mengasumsikan bahwa waktu UTC hanya dapat digunakan pada sistem yang waktu lokalnya digunakan. Memang benar bahwa beberapa bagian stdlib memperlakukan objek datetime naif sebagai memiliki zona waktu lokal (sayangnya). Saya lebih suka yang naive_dt.astimezone()tidak akan ada seperti tersirat bytes.encode()tidak lagi ada di Python 3. Memang benar bahwa itu bermanfaat untuk bekerja dengan waktu UTC secara internal dalam banyak kasus. Ada banyak hal hebat yang dapat dikatakan tentang modul datetime (saya sudah menjawab cukup banyak pertanyaan untuk mendapatkan lencana emas) sebagian besar di luar ruang lingkup untuk pertanyaan: apa yang time.time()dikembalikan.
jfs
4

Saya akhirnya setuju untuk:

>>> import time
>>> time.mktime(time.gmtime())
1509467455.0
Natim
sumber
1
Itu mungkin memuaskan kebutuhan lokal Anda, tetapi mungkin menyesatkan orang yang mengharapkan angka dalam rentang itu menjadi detik sejak zaman [GMT]. time.time()mengembalikan desimal / mengambang seperti 1574115250.818733dan milidetik sejak zaman mudah int(time.time() * 1000)misalnya1574115254915
MarkHu
3

Tidak ada yang namanya "zaman" di zona waktu tertentu. Zaman didefinisikan dengan baik sebagai momen spesifik dalam waktu, jadi jika Anda mengubah zona waktu, waktu itu sendiri juga berubah. Secara khusus, kali ini Jan 1 1970 00:00:00 UTC. Jadi time.time()mengembalikan jumlah detik sejak zaman.

HyperNeutrino
sumber
Memang benar bahwa UTC adalah standar waktu dan bukan zona waktu, standarnya adalah UTC memiliki waktu yang sama dengan GMT. Jadi ....
Craig Hicks
3

timestamp selalu waktu di utc, tetapi ketika Anda menyebutnya timestamp Anda datetime.datetime.fromtimestamp mengembalikan waktu Anda di zona waktu lokal Anda yang sesuai dengan timestamp ini, jadi hasilnya bergantung pada lokasi Anda.

>>> import time, datetime

>>> time.time()
1564494136.0434234

>>> datetime.datetime.now()
datetime.datetime(2019, 7, 30, 16, 42, 3, 899179)
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2019, 7, 30, 16, 43, 12, 4610)

Ada perpustakaan yang bagus arrowdengan perilaku yang berbeda. Dalam kasus yang sama mengembalikan objek waktu Anda dengan zona waktu UTC.

>>> import arrow
>>> arrow.now()
<Arrow [2019-07-30T16:43:27.868760+03:00]>
>>> arrow.get(time.time())
<Arrow [2019-07-30T13:43:56.565342+00:00]>
Ryabchenko Alexander
sumber