Преобразования последовательных значения даты в Perl


Я использую Spreadsheet::XLSX для преобразования XLSX в CSV на Linux. Настраиваемые поля дат преобразуются в числа. Я знаю, что XLSX хранит пользовательские даты в виде серийных значений. Мне нужно найти способ преобразовать эти значения в даты / времена.

Пример:

CSV:  40829
XLSX: 10/13/2011 0:00
Поэтому я пытаюсь понять, как преобразовать 40829 в 10/13/2011 0:00 Я провел некоторые исследования и не смог найти никакого (Perl) решения. Я могу предоставить код, если это необходимо.

Пожалуйста, посоветуйте.

Спасибо ты, - Андрей

2 4

2 ответа:

Excel хранит даты и время в виде числа, представляющего количество дней с момента 1900-Jan-0, плюс дробную часть 24-часового дня: ddddd.tttttt.

Вы можете написать функцию, чтобы сделать вычисления самостоятельно, или вы можете посмотреть на некоторые из модулей, уже размещенных на cpan для этого, DateTime::Format::Excel следует делать то, что вам нужно и DateTimeX::Format::Excel похоже, это тоже сработает.

Согласно предыдущему сообщению, это похоже на число дней с 1 января 1900 года. Сделав 40828 ' - ое января 1900 года (с учетом смещения на единицу, являющегося 1 января, а не 0-ое), мы получим:

use POSIX 'mktime'

my $epoch = mktime 0,0,0, 40829-1,0,0;

print scalar localtime($epoch);

Дает

Thu Oct 13 00:00:00 2011