У меня есть файл .xlsx
, в котором есть таблица, содержащая даты. Когда я читаю таблицу в javascript (с пакетом xlsx nodejs), даты форматируются как числа. Я хотел бы преобразовать эти числа в даты. Например, число 43527 должно быть датой 03.13.2019. Я пробовал new Date(43527*60*60*24*1000)
, но это дает неверный ответ 2089-03-04T00:00:00.000Z
.
Javascript конвертирует короткий номер даты в дату javascript
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
Действительно не нужно, спасибо.
- person Prete; 19.05.2020
*86400*1000
можно сократить до *864e5
- person Yevgen Gorbunkov; 19.05.2020
Если вы нашли дубликат ответа, вы должны пометить этот вопрос как дубликат, а не копировать или переписывать ответ из дубликата. Если у вас есть лучший ответ, опубликуйте его в дубликате. Excel использует OADate, эпоха — 30 декабря 1899 г., а не 1 января 1900 г.
- person RobG; 20.05.2020