Преобразование дней с эпохи в секунды с эпохи

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

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

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

Я не понимаю, почему вы округляетесь. Не могли бы вы объяснить?

Esteban Araya 26.09.2008 04:31

Вероятно, потому что они тоже могут использовать дробные даты.

Chris Jester-Young 26.09.2008 04:38

Примечание: секунды без прыжка с эпохи. Комментарий pfranza верен, но не является причиной вашей проблемы.

Steve Jessop 26.09.2008 04:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
2 981
5

Ответы 5

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

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

1199059200 представляет 31 декабря 2007 г. по всемирному координированному времени. Пример сеанса 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 г. по всемирному координированному времени прибавьте 86400 к 1199059200 и получите 1199145600.

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

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

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

Я не буду говорить от имени OP, но велики шансы, что он использует для этой цели mktime. Есть еще один тред о реализации mkgmtime поверх mktime, но он уродливый: stackoverflow.com/questions/130074

Chris Jester-Young 26.09.2008 04:53

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

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

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

Другие вопросы по теме