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.
Python2.7.3(default,Apr242012,00:00:54)[GCC 4.7.020120414(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-1501:21:05>>>
The tsvariabel adalah waktu kembali dalam hitungan detik. Saya kemudian mengonversinya menjadi string menggunakan datetimeperpustakaan menjadikannya string yang dapat dibaca manusia.
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:
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
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)
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
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.
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.
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.
The
ts
variabel adalah waktu kembali dalam hitungan detik. Saya kemudian mengonversinya menjadi string menggunakandatetime
perpustakaan menjadikannya string yang dapat dibaca manusia.sumber
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()
daridatetime.datetime
:The
now
berbeda dariutcnow
seperti yang diharapkan - jika mereka bekerja dengan cara yang sama:Anda dapat merender timestamp ke string secara eksplisit:
Atau Anda bisa lebih eksplisit untuk memformat stempel waktu sesuai keinginan:
Jika Anda menginginkan format ISO, gunakan
.isoformat()
metode objek:Anda dapat menggunakan ini dalam variabel untuk penghitungan dan pencetakan tanpa konversi.
sumber
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. Gunakandatetime.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.
Setidaknya begitulah konsepnya.
sumber
type(time.time())
memberi<type 'float'>
int()
bersifat polimorfik. Ini akan kembalilong
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):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?
sumber
datetime.utcfromtimestamp
sementara ada 308 upvotes pada jawaban dengandatetime.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. Gunakandatetime.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 tersiratbytes.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 yangtime.time()
dikembalikan.Saya akhirnya setuju untuk:
sumber
time.time()
mengembalikan desimal / mengambang seperti1574115250.818733
dan milidetik sejak zaman mudahint(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
. Jaditime.time()
mengembalikan jumlah detik sejak zaman.sumber
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.Ada perpustakaan yang bagus
arrow
dengan perilaku yang berbeda. Dalam kasus yang sama mengembalikan objek waktu Anda dengan zona waktu UTC.sumber