функция python для возврата javascript date.getTime()

Я пытаюсь создать простую функцию Python, которая будет возвращать то же значение, что и метод javascript new Date().getTime(). Как написано здесь, метод javascript getTime() возвращает количество миллисекунд с 01.01.1970.

Поэтому я просто написал эту функцию Python:

def jsGetTime(dtime):
    diff = datetime.datetime(1970,1,1)
    return (dtime-diff).total_seconds()*1000

в то время как параметр dtime является объектом даты и времени Python.

но я получаю неправильный результат. в чем проблема с моим расчетом?


person user3599803    schedule 18.07.2014    source источник
comment
Не ответ на ваш вопрос, но time.time() делает то же самое. Кроме того, если вам нужно общее количество секунд, почему вы умножаете на 1000? Я не думал, что total_seconds() возвращает миллисекунды.   -  person TheSoundDefense    schedule 18.07.2014
comment
@TheSoundDefense: всего миллисекунд, а не секунд.   -  person Martijn Pieters    schedule 18.07.2014
comment
@MartijnPieters упс, оказывается, я не умею читать.   -  person TheSoundDefense    schedule 18.07.2014
comment
@TheSoundDefense: и time.time() не делают одно и то же; эта функция возвращает смещение от эпохи для данного объекта datetime, тогда как time.time() дает вам только текущую метку времени.   -  person Martijn Pieters    schedule 18.07.2014
comment
@TheSoundDefense: я тоже это понимаю. :-П   -  person Martijn Pieters    schedule 18.07.2014


Ответы (2)


Одна вещь, которую я вынужден отметить здесь: если вы пытаетесь синхронизировать время вашего клиента и время вашего сервера, вам нужно будет передать время сервера клиенту и использовать его в качестве смещения. В противном случае вы всегда будете немного не синхронизированы, так как ваши клиенты/веб-браузеры будут работать на разных машинах, у которых есть собственные часы. Однако общепринятой схемой для ссылки на время в унифицированном поместье является использование миллисекунд эпохи для синхронизации между клиентами и сервером.

Питон

import time, datetime

def now_milliseconds():
   return int(time.time() * 1000)

# reference time.time
# Return the current time in seconds since the Epoch.
# Fractions of a second may be present if the system clock provides them.
# Note: if your system clock provides fractions of a second you can end up 
# with results like: 1405821684785.2 
# our conversion to an int prevents this

def date_time_milliseconds(date_time_obj):
   return int(time.mktime(date_time_obj.timetuple()) * 1000)

# reference: time.mktime() will
# Convert a time tuple in local time to seconds since the Epoch.

mstimeone = now_milliseconds()

mstimetwo = date_time_milliseconds(datetime.datetime.utcnow())

# value of mstimeone
# 1405821684785
# value of mstimetwo
# 1405839684000

Javascript

d = new Date()
d.getTime()

См. этот пост для получения дополнительной информации об манипулировании датами JavaScript.

person Jeff Sheffield    schedule 18.07.2014
comment
На самом деле я не пытаюсь синхронизировать время сервера и клиентов. И на данный момент я не хочу заботиться о различных часовых поясах. Я пытаюсь выполнить функцию python, которая вернет то же самое, что и javascript getTime(), как если бы они оба работали на одном компьютере. - person user3599803; 19.07.2014
comment
На что я и ответил. то есть python: import time; int(time.time() * 1000) возвращает 1405793073980L, а javascript: d = new Date(); d.getTime() возвращает 1405793121544 - person Jeff Sheffield; 19.07.2014
comment
Мне нужно это для данного datetime. time.time() дает мне временную метку только с текущего времени. - person user3599803; 19.07.2014

Дата Javascript работает не так, как вы ожидаете. Но ваш код Python правильный.

Согласно списку времени эпохи, время эпохи на 1 января 2010 г. должно быть

1262304000

Python: (кажется, правильно)

>>> (datetime(2010,1,1) - datetime(1970,1,1)).total_seconds()
1262304000.0

Javascript (кажется неверным)

> new Date(2010,1,1).getTime()
1265011200000

or

> new Date(2010,1,1).getTime()/1000
1265011200

Это связано с тем, что дата Javascript не создает дату так, как вы ожидаете. Во-первых, он создает дату в вашем текущем часовом поясе, а не в UTC. Таким образом, «получить текущее время» в javascript будет временем клиента, тогда как python вернет время utc. Также обратите внимание, что в JS Date есть ошибка, из-за которой месяц на самом деле основан на 0, а не на 1.

> new Date(2010,1,1,0,0,0,0)
Date 2010-02-01T08:00:00.000Z

> new Date(2010,0,1,0,0,0,0)
Date 2010-01-01T08:00:00.000Z

Javascript может создать дату из эпохи:

> new Date(1262304000000)
Date 2010-01-01T00:00:00.000Z

Что правильно.

В качестве альтернативы вы можете использовать следующую функцию JS для получения более точного времени обратите внимание, что месяц по-прежнему начинается с 0, а не с 1

> Date.UTC(2010,0,1)
1262304000000
person Nick Humrich    schedule 18.07.2014
comment
Итак, если я правильно понял, javascript создает даты на основе часового пояса клиента, а мой расчет python - нет. Итак, как я могу получить с помощью python смещение местного часового пояса с учетом перехода на летнее время? - person user3599803; 20.07.2014