Saya harus membuat nilai "Kedaluwarsa" 5 menit di masa mendatang, tetapi saya harus menyediakannya dalam format Timestamp UNIX. Saya punya ini sejauh ini, tetapi sepertinya hack.
def expires():
'''return a UNIX style timestamp representing 5 minutes from now'''
epoch = datetime.datetime(1970, 1, 1)
seconds_in_a_day = 60 * 60 * 24
five_minutes = datetime.timedelta(seconds=5*60)
five_minutes_from_now = datetime.datetime.now() + five_minutes
since_epoch = five_minutes_from_now - epoch
return since_epoch.days * seconds_in_a_day + since_epoch.seconds
Apakah ada modul atau fungsi yang melakukan konversi stempel waktu untuk saya?
python
datetime
unix-timestamp
Daniel Rhoden
sumber
sumber
Jawaban:
Cara lain adalah dengan menggunakan
calendar.timegm
:Ini juga lebih portabel daripada
%s
menandai kestrftime
(yang tidak berfungsi pada Windows).sumber
calendar.timegm(future.utctimetuple())
. Ini memastikan bahwa waktu UTC dilewatkancalendar.timegm
.21600.0
detik (6 jam) bukannya 0,0 untuk TZ mesin unix sayacalendar.timegm(datetime.datetime.utcnow().timetuple())
. Metode menggunakandatetime.datetime.now().utctimetuple()
tidak berfungsi untuk saya (Python 3.2).Sekarang dengan Python> = 3.3 Anda bisa memanggil metode timestamp () untuk mendapatkan timestamp sebagai float.
sumber
datetime.now()
) buruk karena mendorong penggunaan objek datetime naif yang mewakili waktu lokal dan mungkin gagal selama transisi DST (karena ambiguitas yang melekat). Anda bisa menggunakannyats = datetime.now(timezone.utc).timestamp()
sebagai gantinya.utcnow()
. Saya sudah terbiasa bekerja dengan mesin di mana zona waktu diatur ke UTC, tetapi itu tidak seharusnya diasumsikan dalam cuplikan kode ini.Baru saja menemukan ini, dan bahkan lebih pendek.
sumber
time.time()
dapat diatur kembali. Untuk membuat nilai "Kedaluwarsa" 5 menit di masa depan, Anda mungkin perlutime.monotonic()
analog tergantung pada kasus penggunaan Anda.monotonic
dapat digunakan tergantung pada kasus penggunaan Anda misalnya,subprocess
modul menggunakannya untuk menerapkantimeout
opsi.Inilah yang Anda butuhkan:
sumber
mktime(dt.timetuple())
.datetime.now(timezone.utc).timestamp()
disediakan oleh @Tim Tisdall adalah solusi dalam Python 3.3+. Kalau tidak(dt - epoch).total_seconds()
bisa digunakan .Anda dapat menggunakan
datetime.strftime
untuk mendapatkan waktu dalam bentuk Epoch, menggunakan%s
string format:Catatan: Ini hanya berfungsi di linux, dan metode ini tidak bekerja dengan zona waktu.
sumber
ValueError: Invalid format string
).Berikut ini adalah
datetime
solusi berbasis -kurang rusak untuk mengkonversi dari objek datetime ke posix timestamp:Lihat lebih detail di Konversi datetime.date ke stempel waktu UTC dengan Python .
sumber
sumber
Kuncinya adalah memastikan semua tanggal yang Anda gunakan berada di zona waktu utc sebelum Anda mulai mengonversi. Lihat http://pytz.sourceforge.net/ untuk mempelajari cara melakukannya dengan benar. Dengan menormalkan ke utc, Anda menghilangkan ambiguitas transisi tabungan siang hari. Kemudian Anda dapat menggunakan timedelta dengan aman untuk menghitung jarak dari zaman unix, dan kemudian mengonversi ke detik atau milidetik.
Perhatikan bahwa cap waktu unix yang dihasilkan itu sendiri di zona waktu UTC. Jika Anda ingin melihat cap waktu di zona waktu yang dilokalkan, Anda perlu melakukan konversi lain.
Perhatikan juga bahwa ini hanya akan berfungsi untuk tanggal setelah 1970.
sumber
1970-01-01 00:00:00+00:00
). Untuk mendapatkan objek datetime naif di zona waktu lokal:datetime.fromtimestamp(ts)
Berikut ini didasarkan pada jawaban di atas (ditambah koreksi untuk milidetik) dan mengemulasi
datetime.timestamp()
untuk Python 3 sebelum 3,3 ketika zona waktu digunakan.Untuk benar-benar menjawab pertanyaan saat ditanyakan, Anda ingin:
datetime_timestamp
adalah bagian dari kencan sederhana . Tetapi jika Anda menggunakan paket itu, Anda mungkin akan mengetik:yang menangani lebih banyak format / tipe untuk my_datetime.
sumber
sumber
Perhatikan bahwa solusi dengan
timedelta.total_seconds()
bekerja pada python-2.7 +. Gunakancalendar.timegm(future.utctimetuple())
untuk versi Python yang lebih rendah.sumber