Apakah time.time()
dalam modul waktu Python mengembalikan waktu sistem atau waktu dalam UTC?
Apakah time.time()
dalam modul waktu Python mengembalikan waktu sistem atau waktu dalam UTC?
Jawaban:
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 ts
variabel adalah waktu kembali dalam hitungan detik. Saya kemudian mengonversinya menjadi string menggunakan datetime
perpustakaan menjadikannya string yang dapat dibaca manusia.
import time
ketika datetime pada dasarnya memberi Anda cap waktu. Hapus milidetik -str(datetime.datetime.now()).split('.')[0]
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).
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 now
berbeda dari utcnow
seperti 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
import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()
Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
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.
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.
type(time.time())
memberi<type 'float'>
int()
bersifat polimorfik. Ini akan kembali long
jika perlu pada versi Python lama - semua bilangan bulat lama pada versi Python baru.
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?
datetime.utcfromtimestamp
sementara ada 308 upvotes pada jawaban dengan datetime.fromtimestamp
:-(
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).
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.
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.
Saya akhirnya setuju untuk:
>>> import time
>>> time.mktime(time.gmtime())
1509467455.0
time.time()
mengembalikan desimal / mengambang seperti 1574115250.818733
dan milidetik sejak zaman mudah int(time.time() * 1000)
misalnya1574115254915
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.
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 arrow
dengan 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]>