Преобразование дней с эпохи в секунды с эпохи - PullRequest
0 голосов
/ 26 сентября 2008

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

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

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

Ответы [ 5 ]

4 голосов
/ 26 сентября 2008

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

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

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

Редактировать: Поскольку вы и я оба в Новой Зеландии, вот как вы могли получить значение 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)
3 голосов
/ 26 сентября 2008

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

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

1 голос
/ 22 октября 2010

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

1 голос
/ 26 сентября 2008

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

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

0 голосов
/ 26 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...