Saya memiliki datetime
objek Python yang ingin saya konversi ke waktu unix, atau detik / milidetik sejak era 1970-an.
Bagaimana saya melakukan ini?
$ python -c 'import time; print(time.time())'
yang memberi:1584487455.698623
Saya memiliki datetime
objek Python yang ingin saya konversi ke waktu unix, atau detik / milidetik sejak era 1970-an.
Bagaimana saya melakukan ini?
$ python -c 'import time; print(time.time())'
yang memberi:1584487455.698623
Jawaban:
Tampak bagi saya bahwa cara paling sederhana untuk melakukan ini adalah
import datetime
epoch = datetime.datetime.utcfromtimestamp(0)
def unix_time_millis(dt):
return (dt - epoch).total_seconds() * 1000.0
%s
tergantung pada OS! Jadi siapa pun yang ingin kode bekerja dengan andal terlepas dari OS yang mana, TIDAK PERNAH digunakan %s
. Untuk 2,3 <py ver <2,7. Orang dapat dengan mudah membangun total_seconds()
seperti ini:delta.days*86400+delta.seconds+delta.microseconds/1e6
dt
harus dalam UTC (bukan lokal). Lihat jawaban serupa dengan dukungan Python 2.6 / 3
utcfromtimestamp(0)
dapat menyebabkan offset 'tz' hanya jika 'tz' tidak 0. Ini karena dt
di dt- epoch
'tz' telah dihitung di dalamnya di mana sebagai zaman adalah waktu UTC. Cara terbaik untuk menghitung zaman adalah di epoch = datetime.datetime(1970, 1, 1)
mana zona waktu dipertimbangkan.
datetime.utcfromtimestamp(0)
mengembalikan datetime tanpa tzinfo? Itu ada di sana dalam nama metode, utc fromtimestamp. Untuk membuatnya non-naif saya harus melakukan sesuatu seperti datetime.utcfromtimestamp(0).replace(tzinfo=pytz.UTC)
. Ini diperlukan jika dt
zona waktu sadar atau Anda akan mendapatkanTypeError: can't subtract offset-naive and offset-aware datetimes
Dalam Python 3.3, menambahkan metode baru timestamp
:
import datetime
seconds_since_epoch = datetime.datetime.now().timestamp()
Pertanyaan Anda menyatakan bahwa Anda membutuhkan milidetik, yang bisa Anda dapatkan seperti ini:
milliseconds_since_epoch = datetime.datetime.now().timestamp() * 1000
Jika Anda menggunakan timestamp
objek datetime yang naif, maka diasumsikan bahwa objek tersebut berada dalam zona waktu lokal. Gunakan objek datetime sadar-waktu jika ini bukan yang Anda inginkan.
.timestamp()
metode mengasumsikan bahwa datetime input naif berada di zona waktu lokal (dan waktu lokal mungkin ambigu). Jika di UTC maka gunakan dt.replace(tzinfo=timezone.utc).timestamp()
saja .
datetime.datetime.timestamp(datetime.datetime.now())
datetime.datetime.now(pytz.timezone('Europe/Paris')).timestamp() == datetime.datetime.now(pytz.utc).timestamp() == datetime.datetime.utcnow().timestamp()
tetapi tidak (selalu) sama dengan datetime.datetime.now().timestamp()
(yang terakhir ini hanya sama dengan yang lain jika tz lokalnya adalah UTC ...)
fromtimestamp
( docs.python.org/3/library/… )
>>> import datetime
>>> # replace datetime.datetime.now() with your datetime object
>>> int(datetime.datetime.now().strftime("%s")) * 1000
1312908481000
Atau bantuan modul waktu (dan tanpa format tanggal):
>>> import datetime, time
>>> # replace datetime.datetime.now() with your datetime object
>>> time.mktime(datetime.datetime.now().timetuple()) * 1000
1312908681000.0
Dijawab dengan bantuan dari: http://pleac.sourceforge.net/pleac_python/datesandtimes.html
Dokumentasi:
.timetuple()
mengembalikannya tm_isdst=-1
memaksa mktime()
untuk menebak. Mungkin salah menebak selama DST (kemungkinan kesalahan 50% +/- jam). Keduanya '% s' dan mktime()
dapat menggunakan offset utc yang salah untuk tanggal dari masa lalu. Anda memerlukan db zona waktu historis seperti yang disediakan oleh pytz
modul untuk secara andal mengubah waktu setempat ke stempel waktu POSIX (kecuali OS sudah menyediakan db tersebut)
time.mktime(ts.timetuple())
di mana ts adalah objek
mktime/timetuple
. Juga timetuple()
strip pecahan detik dan titik pertanyaannya adalah untuk mendapatkan cap waktu dengan presisi milidetik.
Anda dapat menggunakan Delorean untuk bepergian dalam ruang dan waktu!
import datetime
import delorean
dt = datetime.datetime.utcnow()
delorean.Delorean(dt, timezone="UTC").epoch
Beginilah cara saya melakukannya:
from datetime import datetime
from time import mktime
dt = datetime.now()
sec_since_epoch = mktime(dt.timetuple()) + dt.microsecond/1000000.0
millis_since_epoch = sec_since_epoch * 1000
Rekomendasi dari Python 2.7 docs untuk time
modul
time
modul, tetapi OP bertanya tentang datetime
modul. FWIW, zaman sekarang yang paling sederhana adalahint(time.time())
from datetime import datetime
from calendar import timegm
# Note: if you pass in a naive dttm object it's assumed to already be in UTC
def unix_time(dttm=None):
if dttm is None:
dttm = datetime.utcnow()
return timegm(dttm.utctimetuple())
print "Unix time now: %d" % unix_time()
print "Unix timestamp from an existing dttm: %d" % unix_time(datetime(2014, 12, 30, 12, 0))
timegm()
hanya bekerja dengan waktu utc. Tidak menggunakan tm_isdst
karena itu Anda bisa menggunakan utcnow.timetuple()
bukan utcnow.utctimetuple()
. Catatan: menggunakan naive_local_datetime.utctimetuple()
salah di sini. Itu tidak menerjemahkan waktu lokal ke utc. timetuple()
Panggil juga pecahan sepersekian detik dari hasil (apakah itu penting tergantung pada aplikasi). Juga pertanyaannya tentang * mili * detik, bukan detik
utctimetuple()
strip pecahan detik. Mengalikan dengan 1000
tidak akan mendapatkannya kembali.
>>> import datetime
>>> import time
>>> import calendar
>>> #your datetime object
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2013, 3, 19, 13, 0, 9, 351812)
>>> #use datetime module's timetuple method to get a `time.struct_time` object.[1]
>>> tt = datetime.datetime.timetuple(now)
>>> tt
time.struct_time(tm_year=2013, tm_mon=3, tm_mday=19, tm_hour=13, tm_min=0, tm_sec=9, tm_wday=1, tm_yday=78, tm_isdst=-1)
>>> #If your datetime object is in utc you do this way. [2](see the first table on docs)
>>> sec_epoch_utc = calendar.timegm(tt) * 1000
>>> sec_epoch_utc
1363698009
>>> #If your datetime object is in local timeformat you do this way
>>> sec_epoch_loc = time.mktime(tt) * 1000
>>> sec_epoch_loc
1363678209.0
[1] http://docs.python.org/2/library/datetime.html#datetime.date.timetuple
Berikut ini bentuk lain dari solusi dengan normalisasi objek waktu Anda:
def to_unix_time(timestamp):
epoch = datetime.datetime.utcfromtimestamp(0) # start of epoch time
my_time = datetime.datetime.strptime(timestamp, "%Y/%m/%d %H:%M:%S.%f") # plugin your time object
delta = my_time - epoch
return delta.total_seconds() * 1000.0
import time
seconds_since_epoch = time.mktime(your_datetime.timetuple()) * 1000
* 1000
, Anda memang mendapatkannya seconds_since_epoch
. Menanggapi jawaban ini karena saya tidak peduli dengan milidetik sekarang.
Berikut adalah fungsi yang saya buat berdasarkan jawaban di atas
def getDateToEpoch(myDateTime):
res = (datetime.datetime(myDateTime.year,myDateTime.month,myDateTime.day,myDateTime.hour,myDateTime.minute,myDateTime.second) - datetime.datetime(1970,1,1)).total_seconds()
return res
Anda dapat membungkus nilai yang dikembalikan seperti ini: str (int (res)) Untuk mengembalikannya tanpa nilai desimal untuk digunakan sebagai string atau hanya int (tanpa str)
Ini solusi lain untuk datetime rahasia untuk unixtimestampmillis.
private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public static long GetCurrentUnixTimestampMillis()
{
DateTime localDateTime, univDateTime;
localDateTime = DateTime.Now;
univDateTime = localDateTime.ToUniversalTime();
return (long)(univDateTime - UnixEpoch).TotalMilliseconds;
}