it-swarm-id.com

Dengan Python, bagaimana Anda mengubah objek `datetime` menjadi detik?

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.

192
Nathan Lippi

Untuk tanggal khusus 1 Januari 1970 ada beberapa opsi.

Untuk tanggal mulai lainnya, Anda perlu mendapatkan perbedaan antara kedua tanggal dalam detik. Mengurangi dua tanggal memberikan objek timedelta, yang pada Python 2.7 memiliki fungsi total_seconds().

>>> (t-datetime.datetime(1970,1,1)).total_seconds()
1256083200.0

Tanggal mulai biasanya ditentukan dalam UTC, jadi untuk hasil yang tepat datetime yang Anda masukkan ke formula ini juga harus dalam UTC. Jika datetime Anda belum ada di UTC, Anda harus mengonversinya sebelum menggunakannya, atau melampirkan kelas tzinfo yang memiliki offset yang tepat.

Seperti disebutkan dalam komentar, jika Anda memiliki tzinfo yang dilampirkan ke datetime Anda, maka Anda akan memerlukannya di tanggal mulai juga atau pengurangannya akan gagal; untuk contoh di atas saya akan menambahkan tzinfo=pytz.utc jika menggunakan Python 2 atau tzinfo=timezone.utc jika menggunakan Python 3.

202
Mark Ransom

Untuk mendapatkan waktu Unix (detik sejak 1 Januari 1970):

>>> import datetime, time
>>> t = datetime.datetime(2011, 10, 21, 0, 0)
>>> time.mktime(t.timetuple())
1319148000.0
125
Mark Byers

Mulai dari Python 3.3 ini menjadi sangat mudah dengan metode datetime.timestamp(). Ini tentu saja hanya akan berguna jika Anda membutuhkan jumlah detik dari 1970-01-01 UTC.

from datetime import datetime
dt = datetime.today()  # Get timezone naive now
seconds = dt.timestamp()

Nilai pengembalian akan berupa float yang mewakili pecahan genap sedetik. Jika datetime adalah naif zona waktu (seperti pada contoh di atas), maka akan diasumsikan bahwa objek datetime mewakili waktu lokal, yaitu jumlah detik dari waktu saat ini di lokasi Anda ke 1970-01-01 UTC.

85
Andrzej Pronobis

int (t.strftime("%s")) juga berfungsi

25
dan3

Mungkin di luar topik: untuk mendapatkan waktu UNIX/POSIX dari datetime dan mengubahnya kembali:

>>> import datetime, time
>>> dt = datetime.datetime(2011, 10, 21, 0, 0)
>>> s = time.mktime(dt.timetuple())
>>> s
1319148000.0

# and back
>>> datetime.datetime.fromtimestamp(s)
datetime.datetime(2011, 10, 21, 0, 0)

Perhatikan bahwa zona waktu yang berbeda berdampak pada hasil, mis. pengembalian TZ/DST saya saat ini:

>>>  time.mktime(datetime.datetime(1970, 1, 1, 0, 0).timetuple())
-3600 # -1h

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, mis. UTC + 0100.

Referensi:

22
Robert Lujo

dari python docs:

timedelta.total_seconds()

Kembalikan jumlah total detik yang terkandung dalam durasi. Setara dengan

(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6

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.

12
Michael

ntuk mengonversi objek datetime yang mewakili waktu dalam UTC ke stempel waktu POSIX :

from datetime import timezone

seconds_since_Epoch = utc_time.replace(tzinfo=timezone.utc).timestamp()

Untuk mengonversi objek datetime yang mewakili waktu di zona waktu lokal ke stempel waktu POSIX:

import tzlocal # $ pip install tzlocal

local_timezone = tzlocal.get_localzone()
seconds_since_Epoch = local_timezone.localize(local_time, is_dst=None).timestamp()

Lihat Bagaimana cara mengonversi 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.

2
jfs

Saya mencoba perpustakaan standar calendar.timegm dan berfungsi dengan baik:

# convert a datetime to milliseconds since Epoch
def datetime_to_utc_milliseconds(aDateTime):
    return int(calendar.timegm(aDateTime.timetuple())*1000)

Ref: https://docs.python.org/2/library/calendar.html#calendar.timegm

1
Shaohong Li