datetime
Unix zamana veya 1970 döneminden bu yana saniye / milisaniyeye dönüştürmek istediğim bir Python nesnesi var.
Bunu nasıl yaparım?
$ python -c 'import time; print(time.time())'
1584487455.698623
datetime
Unix zamana veya 1970 döneminden bu yana saniye / milisaniyeye dönüştürmek istediğim bir Python nesnesi var.
Bunu nasıl yaparım?
$ python -c 'import time; print(time.time())'
1584487455.698623
Yanıtlar:
Bana öyle geliyor ki bunu yapmanın en basit yolu
import datetime
epoch = datetime.datetime.utcfromtimestamp(0)
def unix_time_millis(dt):
return (dt - epoch).total_seconds() * 1000.0
%s
işletim sistemine bağlıdır! Böylece herhangi bir işletim sistemi ASLA kullanmanız gerekenden bağımsız olarak kodun güvenilir bir şekilde çalışmasını ister %s
. 2.3 <p ver <2.7 için. Biri total_seconds()
böyle bir şey inşa edebilir :delta.days*86400+delta.seconds+delta.microseconds/1e6
dt
UTC (yerel değil) olmalıdır. Benzer cevaba
utcfromtimestamp(0)
bir 'tz' offset yalnızca 'tz' neden olabilir 0. değil Bunun nedeni dt
de dt- epoch
vardır 'tz' çağın olarak UTC zamanı olduğu içinde hesapladı. Dönemi hesaplamanın en iyi yolu epoch = datetime.datetime(1970, 1, 1)
saat diliminin dikkate alındığı yerdir.
datetime.utcfromtimestamp(0)
tzinfo olmadan datetime dönüyor? Tam burada yöntem adında, utc fromtimestamp. Naif olmamak için böyle bir şey yapmalıyım datetime.utcfromtimestamp(0).replace(tzinfo=pytz.UTC)
. Bu, dt
saat dilimi farkındaysa veya başka bir şey alırsanız gereklidirTypeError: can't subtract offset-naive and offset-aware datetimes
Python 3.3'te yeni yöntem eklendi timestamp
:
import datetime
seconds_since_epoch = datetime.datetime.now().timestamp()
Sorunuz milisaniyeye ihtiyacınız olduğunu belirtti ve bu şekilde alabilirsiniz:
milliseconds_since_epoch = datetime.datetime.now().timestamp() * 1000
Eğer kullanırsanız timestamp
bir naif datetime nesne üzerinde, o zaman yerel saat diliminde olduğu varsayılmıştır. Gerçekleştirmek istediğiniz şey bu değilse, saat dilimine duyarlı datetime nesneleri kullanın.
.timestamp()
yöntem, yerel bir giriş tarih saatinin yerel saat diliminde olduğunu (ve yerel saatin belirsiz olabileceğini) varsayar. UTC'de ise dt.replace(tzinfo=timezone.utc).timestamp()
bunun yerine kullanın .
datetime.datetime.timestamp(datetime.datetime.now())
datetime.datetime.now(pytz.timezone('Europe/Paris')).timestamp() == datetime.datetime.now(pytz.utc).timestamp() == datetime.datetime.utcnow().timestamp()
(her zaman) eşit değil ( datetime.datetime.now().timestamp()
bu sonuncusu yalnızca yerel tz UTC ise ...)
>>> import datetime
>>> # replace datetime.datetime.now() with your datetime object
>>> int(datetime.datetime.now().strftime("%s")) * 1000
1312908481000
Veya zaman modülünün yardımı (ve tarih formatlaması olmadan):
>>> import datetime, time
>>> # replace datetime.datetime.now() with your datetime object
>>> time.mktime(datetime.datetime.now().timetuple()) * 1000
1312908681000.0
Http://pleac.sourceforge.net/pleac_python/datesandtimes.html adresinden yardım alarak yanıtladı
Belgeler:
.timetuple()
döner tm_isdst=-1
o zorlar mktime()
tahmin etmek. DST sırasında yanlış tahmin edebilir (% 50 hata +/- saat). Hem '% s' hem mktime()
de geçmişten gelen tarihler için yanlış utc uzaklığını kullanabilir. pytz
Yerel saati POSIX zaman damgasına güvenilir bir şekilde dönüştürmek için modül tarafından sağlanan gibi tarihsel bir saat dilimine ihtiyacınız vardır (OS zaten böyle bir db
time.mktime(ts.timetuple())
burada ts
mktime/timetuple
. Ayrıca timetuple()
bir saniyenin kesirlerini çıkarır ve sorunun amacı zaman damgasını milisaniye hassasiyetle elde etmektir.
Delorean'ı uzay ve zamanda seyahat etmek için kullanabilirsiniz!
import datetime
import delorean
dt = datetime.datetime.utcnow()
delorean.Delorean(dt, timezone="UTC").epoch
Bunu nasıl yaparım:
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
Modül için Python 2.7 belgelerinden önerilenlertime
time
modülü kullanıyor , ancak OP datetime
modülü sordu . FWIW, en basit dönemint(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()
sadece utc zamanı ile çalışır. Bu tm_isdst
nedenle kullanmak utcnow.timetuple()
yerine kullanamaz utcnow.utctimetuple()
. Not: naive_local_datetime.utctimetuple()
burada kullanmak yanlış olur. Yerel saati utc'ye çevirmez. Ayrıca timetuple()
sonuçtan saniyenin kesirlerini ayırın (önemli olup olmadığı uygulamaya bağlıdır). Ayrıca soru saniye değil, * milli * saniye soruyor
utctimetuple()
saniyenin kesirlerini ayırır. İle çarpmak 1000
onları geri almayacak.
>>> 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
Zaman nesnenizin normalleştirilmesiyle başka bir çözüm biçimi:
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
, alırsınız seconds_since_epoch
. Bu cevabı iptal ediyorum çünkü şu anda milisaniye umurumda değil.
İşte yukarıdaki cevaba dayanarak yaptığım bir fonksiyon
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
Döndürülen değeri şu şekilde sarabilirsiniz: str (int (res)) Dize olarak kullanılacak ondalık değer olmadan veya yalnızca int (str olmadan) döndürmek için
Unixtimestampmillis'e gizli tarih-saat için bu diğer çözüm.
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;
}