Saya punya waktu di UTC dari mana saya ingin jumlah detik sejak zaman.
Saya menggunakan strftime untuk mengubahnya menjadi jumlah detik. Mengambil 1 April 2012 sebagai contoh.
>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
1 April 2012 UTC dari zaman adalah 1333238400 tetapi ini di atas mengembalikan 1333234800 yang berbeda dengan 1 jam.
Jadi sepertinya strftime mengambil waktu sistem saya ke dalam akun dan menerapkan pergeseran zona waktu di suatu tempat. Saya pikir datetime itu benar-benar naif?
Bagaimana saya bisa mengatasi itu? Jika mungkin menghindari untuk mengimpor perpustakaan lain kecuali standar. (Saya memiliki masalah portabilitas).
datetime.datetime.timestamp(datetime.datetime.utcnow())
Jawaban:
Jika Anda ingin mengkonversi datetime python ke detik sejak zaman Anda dapat melakukannya secara eksplisit:
Di Python 3.3+ Anda bisa menggunakan
timestamp()
:Mengapa Anda tidak menggunakannya?
datetime.strftime('%s')
Python sebenarnya tidak mendukung% s sebagai argumen untuk strftime (jika Anda memeriksa di http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior tidak ada dalam daftar), satu-satunya alasan kerjanya adalah karena Python meneruskan informasi ke strftime sistem Anda, yang menggunakan zona waktu lokal Anda.
sumber
.strftime("%s")
: tidak didukung, tidak portabel, diam-diam dapat menghasilkan hasil yang salah untuk objek sadar waktu, gagal jika input dalam UTC (seperti dalam pertanyaan) tetapi zona waktu lokal bukan UTCAttributeError: 'datetime.timedelta' object has no attribute 'total_seconds'
td.seconds + td.days*24*3600
. Ini membuang bagian mikrodetik.Saya memiliki masalah serius dengan Zona Waktu dan semacamnya. Cara Python menangani semua itu sangat membingungkan (bagi saya). Hal-hal tampaknya berfungsi dengan baik menggunakan modul kalender (lihat tautan 1 , 2 , 3 dan 4 ).
sumber
aprilFirst
dalam contoh ini adalah contoh 'sadar' dan menggunakan zona waktu yang berbeda dari zona waktu sistem, hasilnya tidak akan benar (zona waktu hilang dalamtimetuple()
panggilan). Untuk mendapatkan jawaban yang tepat untuk datetime 'sadar' yang dapat Anda gunakanawaredt.timestamp()
pada Python 3 terbaru. Untuk Python 2 lebih sulit; salah satu caranya adalah dengan menggunakanarrow
perpustakaan.arrow.get(awaredt).timestamp
akan melakukannya dengan benar.datetime
objek, jadi saya berasumsi bahwa "Saya punya waktu di UTC" berarti bahwa OP memilikidatetime
objek yang tidak disadari yang diasumsikan berada dalam UTC yang ia inginkan untuk mendapatkanepoch
(jikadatetime
kebetulan TZ-sadar ini mungkin, memang, mengubah keadaan). Juga, ingatlah bahwa jawaban ini hampir 8 tahun dan banyak hal telah terjadi sejak (arrow
dirilis pada 2013, misalnya)sumber
time.time()
(mktime()
mungkin gagal selama transisi DST sambiltime.time()
terus bekerja). Dan itu tidak menjawab pertanyaan kecuali zona waktu lokal adalah UTC (input dalam pertanyaan adalah dalam UTC). Bahkan jika input akan mewakili waktu lokal makamktime()
mungkin juga gagal untuk tanggal masa lalu / masa depan jika tidak menggunakan database tz dan jika zona waktu lokal mungkin memiliki offset utc yang berbeda selama bertahun-tahun misalnya, Eropa / Moskow pada 2010-2015 - - gunakan waktu UTC (seperti dalam pertanyaan) atau objek datetime sadar-waktu sebagai gantinya..now()
) ke cap waktu zaman (dikembalikan olehmktime()
) . Jika Anda membacanya; Anda memahami mengapa input UTC (digunakan dalam pertanyaan) lebih disukai daripada objek datetime naif yang mewakili waktu lokal(Maaf, itu tidak akan membiarkan saya mengomentari jawaban yang ada)
sumber
jika Anda hanya perlu cap waktu dalam waktu unix / zaman, baris yang satu ini berfungsi:
dan hanya bergantung pada
datetime
karya di python2 dan python3sumber
Ini berfungsi di Python 2 dan 3:
Cukup mengikuti dokumen resmi ... https://docs.python.org/2/library/time.html#module-time
sumber
Untuk solusi bebas zona waktu eksplisit, gunakan perpustakaan pytz.
Output (float): 1333238400.0
sumber
Dalam Python 3.7
https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat
sumber