У мене є об’єкт Python, datetime
який я хочу перетворити на час Unix, або секунди / мілісекунди з епохи 1970 року.
Як це зробити?
$ python -c 'import time; print(time.time())'
що дало:1584487455.698623
У мене є об’єкт Python, datetime
який я хочу перетворити на час Unix, або секунди / мілісекунди з епохи 1970 року.
Як це зробити?
$ python -c 'import time; print(time.time())'
що дало:1584487455.698623
Відповіді:
Мені здається, що це найпростіший спосіб зробити це
import datetime
epoch = datetime.datetime.utcfromtimestamp(0)
def unix_time_millis(dt):
return (dt - epoch).total_seconds() * 1000.0
%s
ОС залежить! Таким чином, хто хоче, щоб код працював надійно незалежно від того, яку ОС слід НІКОЛИ не використовувати %s
. Для 2,3 <py вер <2,7. Можна просто побудувати total_seconds()
так:delta.days*86400+delta.seconds+delta.microseconds/1e6
dt
має бути в UTC (не місцевий). Дивіться аналогічну відповідь із підтримкою Python 2.6 / 3
utcfromtimestamp(0)
може спричинити зсув 'tz' лише тоді, коли 'tz' не дорівнює 0. Це відбувається тому, що dt
в ньому dt- epoch
розраховано 'tz', де як епоха - час UTC. Найкращий спосіб обчислити епоху - це час, epoch = datetime.datetime(1970, 1, 1)
коли розглядається часовий пояс.
datetime.utcfromtimestamp(0)
повертає дату без tzinfo? Це прямо там у назві методу, utc fromtimetamp. Для того, щоб зробити це не наївно, я повинен зробити щось подібне datetime.utcfromtimestamp(0).replace(tzinfo=pytz.UTC)
. Це необхідно, якщо dt
відомий часовий пояс, інакше ви отримаєтеTypeError: can't subtract offset-naive and offset-aware datetimes
У Python 3.3 додано новий метод timestamp
:
import datetime
seconds_since_epoch = datetime.datetime.now().timestamp()
У вашому запитанні було вказано, що вам потрібні мілісекунди, які ви можете отримати так:
milliseconds_since_epoch = datetime.datetime.now().timestamp() * 1000
Якщо ви користуєтесь timestamp
наївним об’єктом дати, то передбачається, що він знаходиться в локальному часовому поясі. Використовуйте об'єкти дат, які знають часовий пояс, якщо це не те, що ви маєте намір статися.
.timestamp()
метод передбачає, що час наївної дати вводиться в локальний часовий пояс (а місцевий час може бути неоднозначним). Якщо він у UTC, тоді використовуйте dt.replace(tzinfo=timezone.utc).timestamp()
замість цього .
datetime.datetime.timestamp(datetime.datetime.now())
datetime.datetime.now(pytz.timezone('Europe/Paris')).timestamp() == datetime.datetime.now(pytz.utc).timestamp() == datetime.datetime.utcnow().timestamp()
але не (завжди) рівний datetime.datetime.now().timestamp()
(останній дорівнює лише решті, якщо місцевий тз - 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
Або допомога модуля часу (і без форматування дати):
>>> 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
Документація:
.timetuple()
повертає tm_isdst=-1
це змушує mktime()
здогадуватися. Він може здогадатися неправильно під час DST (50% шансу помилки +/- година). Обидва '% s' mktime()
можуть використовувати неправильне зміщення ультразвукового сигналу для дат із минулого. Вам потрібен історичний db часового поясу, такий як наданий pytz
модулем, щоб надійно перетворити місцевий час на часову мітку POSIX (якщо ОС вже не надає такий db)
time.mktime(ts.timetuple())
де ts - об’єкт
mktime/timetuple
. Також timetuple()
знімає частки секунди, і питання полягає в тому, щоб позначити часову позначку з мілісекундною точністю.
Ви можете використовувати Delorean для подорожі в просторі та часі!
import datetime
import delorean
dt = datetime.datetime.utcnow()
delorean.Delorean(dt, timezone="UTC").epoch
Ось як я це роблю:
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
Рекомендації з модуля Python 2.7 для time
модуля
time
модуль, але ОП запитав про datetime
модуль. FWIW, найпростіша нинішня епохаint(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()
працює лише у utc час. Він не використовує, tm_isdst
тому ви можете використовувати utcnow.timetuple()
замість цього utcnow.utctimetuple()
. Примітка: використання тут naive_local_datetime.utctimetuple()
було б неправильним. Це не переводить місцевий час на utc. Також timetuple()
зателефонуйте на смужки частки секунди від результату (чи це має значення залежить від застосування). Також питання задає про * мілі * секунд, а не секунд
utctimetuple()
смужки частки секунди. Помножуючи їх на 1000
їх не повертається.
>>> 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
Ось ще одна форма рішення з нормалізацією вашого часового об’єкта:
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
, все-таки отримаєте seconds_since_epoch
. Охвалюючи цю відповідь, тому що мене зараз не хвилює мілісекунд.
Ось функція, яку я зробив на основі відповіді вище
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
Ви можете обернути повернене значення так: str (int (res)) Щоб повернути його без десяткового значення, яке буде використовуватися як рядок або просто int (без str)
Це інше рішення для прихованого часу перебування в 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;
}