Python против Javascript DateTime

Я пытаюсь преобразовать вызов API Javascript в Python. Рабочий код javascript работает нормально, генерируя метку времени, подобную этой:

var curdate = new Date();
var gmtstring = curdate.toGMTString();
var utc = Date.parse(gmtstring) / 1000;

Этот результат (это количество секунд с начала эпохи) впоследствии хешируется и используется в вызове API, но это соответствующий раздел. Если кто-нибудь может сообщить мне, как правильно преобразовать это, я был бы очень признателен.

Вот некоторые подробности о различных результатах разных методов:

Javascript (действительный результат API)

var curdate = new Date(2013, 7, 10);
var gmtstring = curdate.toGMTString();
var utc = Date.parse(gmtstring) / 1000;

Результат: 1376089200

Python (неверный результат API)

from datetime import datetime
import calendar

d = datetime(2013, 8, 10)
calendar.timegm(d.utctimetuple())

Результат: 1376092800

Я явно чего-то упускаю, может ли кто-нибудь просветить меня по этому поводу?

Обновлять

Изначально я допустил ошибку в своих примерах, так как Javascript использует даты на основе 0, а даты Python - на основе 1.

Джонатон любезно объяснил, что разница в значениях отличается из-за того, что Python по умолчанию использует UTC, тогда как Javascript по умолчанию использует местный часовой пояс. В моем случае это GMT, которое требуется для API. Теперь мне просто нужно получить этот результат на Python.

Отвечать

Решением было несоответствие предоставленных часовых поясов. Хотя у меня все еще возникают проблемы со сторонним api, я, по крайней мере, теперь получаю правильное время.

Вероятно, это можно очистить:

from datetime import datetime
import calendar
import time
import pytz

def GenerateTimeStamp(d):
    europe = pytz.timezone('Europe/London')
    d = europe.localize(d)
    tuple = d.utctimetuple()
    timestamp = int(time.mktime(tuple))
    return timestamp

Просто укажите дату и время:

GenerateTimeStamp(datetime(2013, 8, 10))

or

GenerateTimeStamp(datetime.utcnow())

В качестве примечания: если вы пробуете это и хотите установить pytz 1 с помощью pip, вы Я могу получить его, используя предварительный тег 2:

pip install --pre pytz

person Paul Coghill    schedule 10.08.2013    source источник


Ответы (3)


Для дат JavaScript аргумент month равен 0–11. Итак, в августе вам нужно сдать 7.

Целочисленное значение, представляющее месяц, начиная с 0 для января до 11 для декабря.

У них также разные часовые пояса по умолчанию: Python по умолчанию использует UTC, а JavaScript по умолчанию использует "локальный" часовой пояс пользователя.

Вы можете использовать Date.UTC() для эквивалент в JavaScript.

var utc = Date.UTC(2013, 7, 10) / 1000;
// 1376092800

Боковое примечание: вы можете использовать getTime(), чтобы получить метку времени а Date.

var curdate = new Date(2013, 7, 10);
var utc = curdate.getTime() / 1000;
person Jonathan Lonowski    schedule 10.08.2013
comment
Упс, ошибка моя, исправил пример даты. Просто посмотрите на ваше предложение UTC. - person Paul Coghill; 10.08.2013
comment
Ах, это объясняет разницу в примерах, javascript - это результат, который мне нужен. Мой часовой пояс - GMT, что объясняет это. Не могли бы вы подсказать, как получить результат по Гринвичу в Python? - person Paul Coghill; 10.08.2013
comment
@PaulCoghill Ну, теперь у вас есть часовой пояс для этой даты в формате UTC / GMT из Python; это действительно кажется проблемой. Если вы хотите, чтобы Python создавал datetimes в другом часовом поясе, вы можете передать экземпляр пользовательский tzinfo подкласс: datetime(2013, 8, 10, tzinfo=desiredTZ). Вы также можете использовать pytz: pytz.timezone('...').localize(datetime(2013, 8, 10)). - person Jonathan Lonowski; 10.08.2013

new Date(2013, 8, 10) в javascript означает 10 сентября 2013 г.

datetime(2013, 8, 10) в Python означает 10 августа 2013 г.

Вы сравниваете две разные даты.

Местное время против UTC

Результаты могут отличаться (часовой пояс для моей системы: Азия / Сеул).

javascript

> new Date(2013, 7, 10) / 1000
1376060400
> Date.UTC(2013, 7, 10) / 1000
1376092800

Python

>>> import calendar
>>> import datetime
>>> import time
>>> time.mktime(datetime.datetime(2013, 8, 10).timetuple())
1376060400.0
>>> calendar.timegm(datetime.datetime(2013, 8, 10).timetuple())
1376092800

См. Python - calendar.timegm () vs. time.mktime ()

person falsetru    schedule 10.08.2013
comment
Спасибо, я прочитаю статью, которую вы порекомендовали. Спасибо за обновление, хотя API, который мне нужно вызвать, ожидает 1376089200 на эту дату, как указано в примере в вопросе. - person Paul Coghill; 10.08.2013
comment
@PaulCoghill, какой у вас часовой пояс? - person falsetru; 10.08.2013
comment
ВРЕМЯ ПО ГРИНВИЧУ. Хотя в настоящее время это BST (британское летнее время), javascript работает и в том, и в другом. - person Paul Coghill; 10.08.2013
comment
@PaulCoghill, Вы пробовали time.mktime(datetime.datetime(2013, 8, 10).timetuple()) в своей системе? - person falsetru; 10.08.2013
comment
time.mktime (datetime.datetime (2013, 8, 10) .timetuple ()) возвращает 1376092800.0 - person Paul Coghill; 10.08.2013

В дополнение к приведенному выше ответу Джонатана я мог бы порекомендовать это на стороне питона:

 d = datetime(2013, 8, 10)
 d.strftime("%s")

Это вернет: '1376107200'

person Josh Rumbut    schedule 10.08.2013
comment
Для меня это возвращает: 1376089200 локально 1376092800 на удаленном сервере - person Paul Coghill; 10.08.2013