Javascript конвертирует короткий номер даты в дату javascript

У меня есть файл .xlsx, в котором есть таблица, содержащая даты. Когда я читаю таблицу в javascript (с пакетом xlsx nodejs), даты форматируются как числа. Я хотел бы преобразовать эти числа в даты. Например, число 43527 должно быть датой 03.13.2019. Я пробовал new Date(43527*60*60*24*1000), но это дает неверный ответ 2089-03-04T00:00:00.000Z.


person Max888    schedule 19.05.2020    source источник
comment
Есть ли какая-то логика, например, 43527 должна быть равна заданной дате?   -  person Th3    schedule 19.05.2020
comment
Дата javascript основана на 1 января 1970 года, а дата Excel основана на 1 января 1900 года. Дополнительная информация о хранении даты Excel здесь   -  person James    schedule 19.05.2020
comment
На самом деле 43527 соответствует «03 марта 2019 года».   -  person Yevgen Gorbunkov    schedule 19.05.2020
comment
@James — эпоха JS равна 0, но Excel (OADate) день эпохи равен 1, что, как ни странно, делает 1 января 1900 года днем ​​2. В терминах ECMAScript эквивалентная эпоха OADate — 30 декабря 1899 года. Попробуйте здесь.   -  person RobG    schedule 20.05.2020


Ответы (1)


Excel хранит даты внутри, используя OLE Automation Date (OADate).

Базовая дата OLE-автоматизации — полночь 30 декабря 1899 года. Дата OLE-автоматизации реализована в виде числа с плавающей запятой, интегральная составляющая которого — это количество дней до или после полуночи 30 декабря 1899 года, а дробная часть компонент представляет время в этот день, разделенное на 24. [https://docs.microsoft.com/en-us/dotnet/api/system.datetime.tooadate?view=netcore-3.1#remarks]

Вам нужно вычесть 25 569, то есть количество дней между 30 декабря 1899 года и 1 января 1970 года, перед преобразованием в миллисекунды.

Чтобы преобразовать дату:

var excelDate = 43527;
var parsedDate = new Date((excelDate - 25569) * 86400 * 1000)).toISOString();

Как упоминалось здесь Преобразование серийного номера даты Excel в дату с помощью Javascript

person Prete    schedule 19.05.2020
comment
Действительно не нужно, спасибо. - person Prete; 19.05.2020
comment
*86400*1000 можно сократить до *864e5 - person Yevgen Gorbunkov; 19.05.2020
comment
Если вы нашли дубликат ответа, вы должны пометить этот вопрос как дубликат, а не копировать или переписывать ответ из дубликата. Если у вас есть лучший ответ, опубликуйте его в дубликате. Excel использует OADate, эпоха — 30 декабря 1899 г., а не 1 января 1900 г. - person RobG; 20.05.2020