Jika d = date(2011, 1, 1)di UTC:
>>> from datetime import datetime, date
>>> import calendar
>>> timestamp1 = calendar.timegm(d.timetuple())
>>> datetime.utcfromtimestamp(timestamp1)
datetime.datetime(2011, 1, 1, 0, 0)
Jika dberada di zona waktu lokal:
>>> import time
>>> timestamp2 = time.mktime(d.timetuple()) # DO NOT USE IT WITH UTC DATE
>>> datetime.fromtimestamp(timestamp2)
datetime.datetime(2011, 1, 1, 0, 0)
timestamp1dan timestamp2mungkin berbeda jika tengah malam di zona waktu lokal tidak sama dengan waktu tengah malam di UTC.
mktime()dapat mengembalikan hasil yang salah jika dsesuai dengan waktu lokal yang ambigu (mis., selama transisi DST) atau jika dmerupakan masa lalu (masa depan) ketika utc offset mungkin berbeda dan C mktime()tidak memiliki akses ke database tz pada platform yang diberikan . Anda dapat menggunakan pytzmodul (mis. Via tzlocal.get_localzone()) untuk mendapatkan akses ke database tz di semua platform . Juga, utcfromtimestamp()mungkin gagal dan mktime()dapat mengembalikan stempel waktu non-POSIX jika "right"zona waktu digunakan .
Untuk mengonversi datetime.dateobjek yang mewakili tanggal dalam UTC tanpa calendar.timegm():
DAY = 24*60*60 # POSIX day in seconds (exact value)
timestamp = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * DAY
timestamp = (utc_date - date(1970, 1, 1)).days * DAY
Bagaimana saya bisa mendapatkan tanggal yang dikonversi ke detik sejak zaman sesuai dengan UTC?
Untuk mengonversi datetime.datetime(bukan datetime.date) objek yang sudah mewakili waktu dalam UTC ke timestamp POSIX yang sesuai (a float).
Python 3.3+
datetime.timestamp():
from datetime import timezone
timestamp = dt.replace(tzinfo=timezone.utc).timestamp()
Catatan: Diperlukan untuk menyediakan timezone.utcsecara eksplisit jika tidak .timestamp()menganggap bahwa objek datetime naif Anda berada di zona waktu lokal.
Python 3 (<3.3)
Dari dokumen untuk datetime.utcfromtimestamp():
Tidak ada metode untuk mendapatkan stempel waktu dari instance datetime, tetapi stempel waktu POSIX yang terkait dengan instance datetime dt dapat dengan mudah dihitung sebagai berikut. Untuk dt naif:
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)
Dan untuk dt sadar:
timestamp = (dt - datetime(1970,1,1, tzinfo=timezone.utc)) / timedelta(seconds=1)
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:
timestamp = (dt - datetime(1970, 1, 1)).total_seconds()
di mana timedelta.total_seconds()setara dengan (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6dihitung dengan pembagian yang benar diaktifkan.
from __future__ import division
from datetime import datetime, timedelta
def totimestamp(dt, epoch=datetime(1970,1,1)):
td = dt - epoch
# return td.total_seconds()
return (td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**6
now = datetime.utcnow()
print now
print totimestamp(now)
Waspadai masalah floating-point .
Keluaran
2012-01-08 15:34:10.022403
1326036850.02
Cara mengonversi datetimeobjek sadar ke cap waktu POSIX
assert dt.tzinfo is not None and dt.utcoffset() is not None
timestamp = dt.timestamp() # Python 3.3+
Pada Python 3:
from datetime import datetime, timedelta, timezone
epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
timestamp = (dt - epoch) / timedelta(seconds=1)
integer_timestamp = (dt - epoch) // timedelta(seconds=1)
Pada Python 2:
# utc time = local time - utc offset
utc_naive = dt.replace(tzinfo=None) - dt.utcoffset()
timestamp = (utc_naive - datetime(1970, 1, 1)).total_seconds()