2008-09-26 3 views
0

На моем новом рабочем месте они представляют множество дат как «дни с эпохи» (которые я буду называть далее DSE). Я сталкиваюсь с проблемами при преобразовании JavaScript из DSE в секундах с эпохи (временные метки UNIX). Вот моя функция для выполнения преобразования:Преобразование дней с эпохи в секунды с эпохи

function daysToTimestamp(days) { 
    return Math.round(+days * 86400); 
} 

В качестве примера, когда я прохожу в 13878 (ожидается, что это представляет 1 января 2008 года), я получаю обратно 1199059200, 1199098800 не как я ожидал. Зачем?

+0

Я не понимаю, почему вы округляете. Не могли бы вы объяснить? – 2008-09-26 00:31:24

+0

Возможно, потому, что они могут использовать дробные даты. – 2008-09-26 00:38:38

+0

Примечание: секунды с эпохи. Комментарий pfranza - это правда, но не причина вашей проблемы. – 2008-09-26 00:40:45

ответ

3

Это потому, что она не является ни линейным представлением времени, ни истинное представление UTC (хотя это часто ошибочно принимают за обоих), как раз она представляет являются UTC, но это не имеет никакого способа представления UTC високосные секунды

http://en.wikipedia.org/wiki/Unix_time

4

1199059200 представляет 31 декабря 2007 в UTC. Пример Python сессии:

>>> import time 
>>> time.gmtime(1199059200) 
(2007, 12, 31, 0, 0, 0, 0, 365, 0) 

Помните, что все time_t значения от UTC. :-) Вы должны настроить в соответствии с вашим часовым поясом.

Edit: Так как вы и я, как в Новой Зеландии, вот как вы, возможно, получили 1199098800 значение:

>>> time.localtime(1199098800) 
(2008, 1, 1, 0, 0, 0, 1, 1, 1) 

Это так, потому что в Новый год (летом в Новой Зеландии), часовой пояс здесь +1300. Делайте математику и смотрите. :-)

На 1 января 2008 года в UTC, добавить 86400 к 1199059200, и получить 1199145600.

>>> time.gmtime(1199145600) 
(2008, 1, 1, 0, 0, 0, 1, 1, 0) 
1

Unix раз (time_t) представлены в секундах с 1 января 1970 года не миллисекунды.

Я представляю, что вы видите, это разница во времени. Дельта у вас есть 11 часов, как вы получаете ожидаемое значение?

-1

Вы должны умножить 86400000

1 день = 24 часа * 60 минут * 60 секунд * 1000 миллисекунд = 86400000

1

Поскольку 1199098800/86400 = 13878,4583333333333 (с 3 повторяющейся навсегда), а не 13878.0. Он округляется до 13878.0, поскольку он хранится как целое число. Если вы хотите увидеть разницу, которую она делает, попробуйте следующее: .4583333333333 * 86400 = 39599.99999999712. Даже это делает его несколько неправильным, но именно здесь возникает несоответствие, поскольку 1199098800-1199059200 = 35600.

Смежные вопросы