Permintaan maaf untuk pertanyaan sederhana ... Saya baru mengenal Python ... Saya telah mencari-cari dan sepertinya tidak ada yang berhasil.
Saya memiliki banyak objek datetime dan saya ingin menghitung jumlah detik sejak waktu yang tetap di masa lalu untuk masing-masing (misalnya sejak 1 Januari 1970).
import datetime
t = datetime.datetime(2009, 10, 21, 0, 0)
Ini tampaknya hanya membedakan antara tanggal yang memiliki hari yang berbeda:
t.toordinal()
Bantuan apa pun sangat kami hargai.
python
python-2.7
Nathan Lippi
sumber
sumber
datetime.date
ke stempel waktu UTC di Pythonint(t.timestamp())
Jawaban:
Untuk tanggal khusus 1 Januari 1970 ada beberapa opsi.
Untuk tanggal mulai lainnya, Anda perlu mendapatkan perbedaan antara kedua tanggal dalam detik. Mengurangkan dua tanggal memberikan
timedelta
objek, yang pada Python 2.7 memilikitotal_seconds()
fungsi.Tanggal mulai biasanya ditentukan dalam UTC, jadi untuk hasil yang tepat
datetime
Anda memasukkan ke dalam formula ini juga harus dalam UTC. Jika Andadatetime
belum menggunakan UTC, Anda harus mengonversinya sebelum menggunakannya, atau melampirkantzinfo
kelas yang memiliki offset yang tepat.Seperti disebutkan dalam komentar, jika Anda memiliki
tzinfo
lampiran pada Andadatetime
maka Anda akan memerlukannya pada tanggal mulai juga atau pengurangan akan gagal; untuk contoh di atas saya akan menambahkantzinfo=pytz.utc
jika menggunakan Python 2 atautzinfo=timezone.utc
jika menggunakan Python 3.sumber
datetime.datetime(1970,1,1,tzinfo=pytz.utc)
.datetime.datetime.utcfromtimestamp(0)
Saya telah menggunakan ini untuk mendapatkan 'zaman' dengan mudah. Perhatikan bahwa zaman tidak selalu sama di semua sistem.time.time()
dandatetime.now() - datetime(1970, 1, 1)
berbeda dengan 7200 detik. Sebaliknya gunakan(t - datetime.datetime.fromtimestamp(0)).total_seconds()
. Jangan tidak menggunakanutcfromtimestamp(0)
jika Anda ingin mengkonversi datetime di zona waktu lokal Anda.Untuk mendapatkan waktu Unix (detik sejak 1 Januari 1970):
sumber
t
adalah waktu setempat. Pengimbangan UTC untuk zona waktu lokal mungkin berbeda di masa lalu dan jikamktime()
(perpustakaan C) tidak memiliki akses ke data zona waktu historis pada platform tertentu daripada yang mungkin gagal (pytz
adalah cara portabel untuk mengakses basis data tz). Juga, waktu lokal mungkin ambigu misalnya, selama transisi DST - Anda perlu info tambahan untuk mengacaukan mis., Jika Anda tahu bahwa nilai tanggal / waktu berturut-turut akan meningkat dalam file logtime.mktime(datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timetuple())
hasil1564819506.0
, diam-diam menjatuhkan milidetik, tetapidatetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timestamp()
(jawaban Andrzej Pronobis) menghasilkan1564819506.912
, hasil yang diharapkan.Mulai dari Python 3.3 ini menjadi sangat mudah dengan
datetime.timestamp()
metode ini. Ini tentu saja hanya akan berguna jika Anda membutuhkan jumlah detik dari 1970-01-01 UTC.Nilai pengembalian akan berupa float yang mewakili fraksi genap sedetik. Jika datetime adalah naif zona waktu (seperti pada contoh di atas), akan diasumsikan bahwa objek datetime mewakili waktu lokal, yaitu Ini akan menjadi jumlah detik dari waktu saat ini di lokasi Anda ke 1970-01-01 UTC.
sumber
Mungkin di luar topik: untuk mendapatkan waktu UNIX / POSIX dari datetime dan mengubahnya kembali:
Perhatikan bahwa zona waktu yang berbeda berdampak pada hasil, misalnya pengembalian TZ / DST saya saat ini:
oleh karena itu orang harus mempertimbangkan untuk menormalkan ke UTC dengan menggunakan versi fungsi UTC.
Perhatikan bahwa hasil sebelumnya dapat digunakan untuk menghitung offset UTC zona waktu Anda saat ini. Dalam contoh ini, ini + 1j, yaitu UTC + 0100.
Referensi:
sumber
mktime()
mungkin gagal . Secara umum, Anda perlupytz
mengonversi waktu lokal ke utc, untuk mendapatkan cap waktu POSIX.int (t.strftime("%s"))
juga berfungsisumber
import datetime; t = datetime.datetime(2011, 10, 21, 0, 0)
(seperti yang ditentukan oleh OP). Tapi sungguh, saya ragu% s adalah format waktu yang baru ditambahkan.%s
tidak didukung (ini dapat bekerja pada beberapa platform ifft
adalah objek waktu naif yang mewakili waktu lokal dan jika perpustakaan C lokal memiliki akses ke database tz kalau tidak hasilnya mungkin salah). Jangan gunakan itu.%s
tidak didokumentasikan di mana pun. Saya menaburnya dalam kode nyata dan bertanya-tanya apa ini dan lihat di dokumentasi dan tidak ada yang namanya%s
. Hanya ada dengan S besar hanya untuk detik.dari python docs:
Kembalikan jumlah total detik yang terkandung dalam durasi. Setara dengan
dihitung dengan pembagian yang benar diaktifkan.
Perhatikan bahwa untuk interval waktu yang sangat besar (lebih dari 270 tahun pada kebanyakan platform) metode ini akan kehilangan akurasi mikrodetik.
Fungsi ini baru dalam versi 2.7.
sumber
Untuk mengonversi objek datetime yang mewakili waktu dalam UTC ke stempel waktu POSIX :
Untuk mengonversi objek datetime yang mewakili waktu di zona waktu lokal ke stempel waktu POSIX:
Lihat Bagaimana cara mengubah waktu lokal ke UTC dengan Python? Jika basis data tz tersedia pada platform tertentu; solusi stdlib-only dapat berfungsi .
Ikuti tautan jika Anda membutuhkan solusi untuk
<3.3
versi Python.sumber
Saya mencoba kalender.timegm perpustakaan standar dan berfungsi dengan baik:
Ref: https://docs.python.org/2/library/calendar.html#calendar.timegm
sumber
aDateTime
ini adalah waktu UTC