Saya berurusan dengan tanggal dalam Python dan saya perlu mengubahnya ke stempel waktu UTC untuk digunakan dalam Javascript. Kode berikut tidak berfungsi:
>>> d = datetime.date(2011,01,01)
>>> datetime.datetime.utcfromtimestamp(time.mktime(d.timetuple()))
datetime.datetime(2010, 12, 31, 23, 0)
Mengonversi objek tanggal terlebih dahulu ke datetime juga tidak membantu. Saya mencoba contoh di tautan ini dari, tetapi:
from pytz import utc, timezone
from datetime import datetime
from time import mktime
input_date = datetime(year=2011, month=1, day=15)
dan sekarang:
mktime(utc.localize(input_date).utctimetuple())
atau
mktime(timezone('US/Eastern').localize(input_date).utctimetuple())
tidak bekerja.
Jadi pertanyaan umum: bagaimana saya bisa mengubah tanggal menjadi detik sejak zaman sesuai dengan UTC?
datetime.date
, yang lain berusaha untuk mengubah representasi string dari satu zona waktu ke yang lain. Sebagai seseorang yang mencari solusi untuk masalah ini, saya mungkin tidak menyimpulkan bahwa yang terakhir akan memberikan jawaban yang saya cari.Jawaban:
Jika
d = date(2011, 1, 1)
di UTC:Jika
d
berada di zona waktu lokal:timestamp1
dantimestamp2
mungkin berbeda jika tengah malam di zona waktu lokal tidak sama dengan waktu tengah malam di UTC.mktime()
dapat mengembalikan hasil yang salah jikad
sesuai dengan waktu lokal yang ambigu (mis., selama transisi DST) atau jikad
merupakan masa lalu (masa depan) ketika utc offset mungkin berbeda dan Cmktime()
tidak memiliki akses ke database tz pada platform yang diberikan . Anda dapat menggunakanpytz
modul (mis. Viatzlocal.get_localzone()
) untuk mendapatkan akses ke database tz di semua platform . Juga,utcfromtimestamp()
mungkin gagal danmktime()
dapat mengembalikan stempel waktu non-POSIX jika"right"
zona waktu digunakan .Untuk mengonversi
datetime.date
objek yang mewakili tanggal dalam UTC tanpacalendar.timegm()
:Bagaimana saya bisa mendapatkan tanggal yang dikonversi ke detik sejak zaman sesuai dengan UTC?
Untuk mengonversi
datetime.datetime
(bukandatetime.date
) objek yang sudah mewakili waktu dalam UTC ke timestamp POSIX yang sesuai (afloat
).Python 3.3+
datetime.timestamp()
:Catatan: Diperlukan untuk menyediakan
timezone.utc
secara eksplisit jika tidak.timestamp()
menganggap bahwa objek datetime naif Anda berada di zona waktu lokal.Python 3 (<3.3)
Dari dokumen untuk
datetime.utcfromtimestamp()
:Bacaan menarik: Epoch time vs time of day tentang perbedaan antara jam berapa sekarang? dan Berapa detik telah berlalu?
Lihat juga: datetime membutuhkan metode "zaman"
Python 2
Untuk mengadaptasi kode di atas untuk Python 2:
di mana
timedelta.total_seconds()
setara dengan(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
dihitung dengan pembagian yang benar diaktifkan.Contoh
Waspadai masalah floating-point .
Keluaran
Cara mengonversi
datetime
objek sadar ke cap waktu POSIXPada Python 3:
Pada Python 2:
sumber
timestamp = (dt - datetime.fromtimestamp(0)).total_seconds()
:?datetime(1970, 1, 1)
lebih eksplisit.fromtimestamp()
salah di sini (dt
di UTC jadiutcfromtimestamp()
harus digunakan sebagai gantinya).totimestamp()
fungsi dalam jawabannya.Untuk sistem unix saja :
Catatan 1: dizzyf mengamati bahwa ini menerapkan zona waktu yang dilokalkan . Jangan gunakan dalam produksi.
Catatan 2: Jakub Narębski mencatat bahwa ini mengabaikan informasi zona waktu bahkan untuk waktu penyadaran offset (diuji untuk Python 2.7).
sumber
man strftime
sistem Unix-like.Asumsi 1: Anda mencoba mengonversi tanggal menjadi cap waktu, namun karena tanggal mencakup periode 24 jam, tidak ada satu cap waktu yang mewakili tanggal tersebut. Saya akan berasumsi bahwa Anda ingin mewakili cap waktu dari tanggal tersebut di tengah malam (00: 00: 00.000).
Asumsi 2: Tanggal yang Anda sajikan tidak terkait dengan zona waktu tertentu, namun Anda ingin menentukan offset dari zona waktu tertentu (UTC). Tanpa mengetahui zona waktu tanggal, tidak mungkin untuk menghitung cap waktu untuk zona waktu tertentu. Saya akan berasumsi bahwa Anda ingin memperlakukan tanggal seolah-olah berada di zona waktu sistem lokal.
Pertama, Anda dapat mengonversi instance tanggal menjadi tuple yang mewakili berbagai komponen waktu menggunakan
timetuple()
anggota:Anda kemudian dapat mengubahnya menjadi timestamp menggunakan
time.mktime
:Anda dapat memverifikasi metode ini dengan mengujinya dengan waktu sendiri (1970-01-01), dalam hal ini fungsi tersebut harus mengembalikan offset zona waktu untuk zona waktu lokal pada tanggal tersebut:
28800.0
adalah 8 jam, yang akan benar untuk zona waktu Pasifik (tempat saya berada).sumber
ikuti dokumen python2.7, Anda harus menggunakan calendar.timegm () alih-alih time.mktime ()
sumber
d
di UTC?Saya mendefinisikan dua fungsi saya sendiri
sini:
sumber
pertanyaannya sedikit bingung. cap waktu bukan UTC - itu hal yang Unix. tanggalnya mungkin UTC? dengan asumsi itu, dan jika Anda menggunakan Python 3.2+, tanggal sederhana membuat ini sepele:
jika Anda benar-benar memiliki tahun, bulan dan hari, Anda tidak perlu membuat
date
:dan jika tanggalnya dalam zona waktu lain (ini penting karena kami mengasumsikan tengah malam tanpa waktu yang terkait):
[ide di balik tanggal sederhana adalah untuk mengumpulkan semua tanggal dan waktu hal python dalam satu kelas yang konsisten, sehingga Anda dapat melakukan konversi apa pun. jadi, misalnya, itu juga akan berubah:
]
sumber
SimpleDate(date(2011,1,1), tz='America/New_York')
memunculkanNoTimezone
, sementarapytz.timezone('America/New_York')
tidak memunculkan pengecualian (simple-date==0.4.8
,pytz==2014.7
).pip install simple-date
, sepertinya hanya python3 / pip3.Menggunakan paket panah :
sumber
arrow
menggunakandateutil
dandateutil
telah dikenal selama bertahun-tahun bug yang berhubungan dengan penanganan zona waktu. Jangan menggunakannya jika Anda membutuhkan hasil yang benar untuk zona waktu dengan offset UTC yang tidak tetap (tidak masalah untuk menggunakannya untuk zona waktu UTC tetapi stdlib menangani case UTC juga ok).String waktu yang lengkap berisi:
[+HHMM or -HHMM]
Sebagai contoh:
1970-01-01 06:00:00 +0500
==1970-01-01 01:00:00 +0000
==UNIX timestamp:3600
catatan:
Edit:
sumber
1970-01-01 06:00:00 +0500
ke3600
seperti yang Anda minta.timezone
dalampython2
, Anda dapat melakukan perhitungan (06:00:00
-+0500
=01:00:00
) secara manual.Mengingat Anda memiliki
datetime
objek yang dipanggild
, gunakan yang berikut untuk mendapatkan cap waktu di UTC:Dan untuk arah yang berlawanan, gunakan berikut ini:
sumber
Saya terkesan dengan diskusi yang mendalam.
2 sen saya:
dari impor datetime waktu impor datetime
timestamp di utc adalah:
atau,
jika sekarang hasil dari datetime.now (), dalam DST yang sama
sumber