Вот сопоставление для справки, при условии UTC для систем электронных таблиц, таких как Microsoft Excel:
Unix Excel Mac Excel Human Date Human Time
Excel Epoch -2209075200 -1462 0 1900/01/00* 00:00:00 (local)
Excel ≤ 2011 Mac† -2082758400 0 1462 1904/12/31 00:00:00 (local)
Unix Epoch 0 24107 25569 1970/01/01 00:00:00 UTC
Example Below 1234567890 38395.6 39857.6 2009/02/13 23:31:30 UTC
Signed Int Max 2147483648 51886 50424 2038/01/19 03:14:08 UTC
One Second 1 0.0000115740… — 00:00:01
One Hour 3600 0.0416666666… ― 01:00:00
One Day 86400 1 1 ― 24:00:00
* & ldquo; Jan Zero, 1900 & rdquo; 1899/12/31; см. раздел Ошибка ниже. † В Excel 2011 для Mac (и старше) используется система дат 1904 .
Поскольку я часто использую awk
для обработки CSV и содержимого, разделенного пробелами, я разработал способ преобразования эпох UNIX в часовой пояс / DST -адресуемый формат даты Excel:
echo 1234567890 |awk '{
# tries GNU date, tries BSD date on failure
cmd = sprintf("date -d@%d +%%z 2>/dev/null || date -jf %%s %d +%%z", $1, $1)
cmd |getline tz # read in time-specific offset
hours = substr(tz, 2, 2) + substr(tz, 4) / 60 # hours + minutes (hi, India)
if (tz ~ /^-/) hours *= -1 # offset direction (east/west)
excel = $1/86400 + hours/24 + 25569 # as days, plus offset
printf "%.9f\n", excel
}'
Я использовал echo
для этого примера, но вы можете передать файл, в котором первый столбец (для первой ячейки в формате .csv, назовите его awk -F,
) - это эпоха UNIX. Измените $1
, чтобы представить желаемый номер столбца / ячейки, или используйте вместо него переменную.
Это делает системный вызов date
. Если у вас будет надежная версия GNU, вы можете удалить 2>/dev/null || date … +%%z
и вторую , $1
. Учитывая распространенность GNU, я бы не рекомендовал использовать версию BSD.
getline
считывает смещение часового пояса, выведенное date +%z
в tz
, которое затем переводится в hours
. Формат будет выглядеть как -0700
( PDT ) или +0530
( IST ), поэтому первая извлеченная подстрока будет 07
или 05
, вторая - 00
или 30
(затем делится на 60, чтобы выразить в часах), и третье использование tz
определяет, является ли наше смещение отрицательным, и изменяет hours
при необходимости.
Формула, приведенная во всех других ответах на этой странице, используется для установки excel
с добавлением настройки часового пояса с учетом перехода на летнее время: hours/24
.
Если вы используете более старую версию Excel для Mac, вам нужно будет использовать 24107
вместо 25569
(см. Сопоставление выше).
Чтобы преобразовать любое произвольное время, не относящееся к эпохе, в удобное для Excel время с датой GNU:
echo "last thursday" |awk '{
cmd = sprintf("date -d \"%s\" +\"%%s %%z\"", $0)
cmd |getline
hours = substr($2, 2, 2) + substr($2, 4) / 60
if ($2 ~ /^-/) hours *= -1
excel = $1/86400 + hours/24 + 25569
printf "%.9f\n", excel
}'
Это в основном тот же код, но date -d
больше не имеет @
для представления эпохи Unix (учитывая, насколько способен анализатор строк, я на самом деле удивлен, что @
является обязательным; какая другая дата формат имеет 9-10 цифр?) и теперь запрашивается два вывода: эпоха и смещение часового пояса. Поэтому вы можете использовать, например, @1234567890
в качестве ввода.
ошибка
Lotus 1-2-3 (оригинальное программное обеспечение для работы с электронными таблицами) намеренно рассматривал 1900 год как високосный год , несмотря на то, что это не так (это уменьшало кодовую базу в то время, когда каждый байт считается). Microsoft Excel сохранил эту ошибку для совместимости, пропустив день 60 (фиктивный 1900/02/29), сохранив отображение Lotus 1-2-3 дня 59 на 1900/02/28. Вместо этого LibreOffice назначил день 60 на 1900/02/28 и перенес все предыдущие дни назад на один.
Любая дата до 1900/03/01 может быть как выходной:
Day Excel LibreOffice
-1 -1 1899/12/29
0 1900/01/00* 1899/12/30
1 1900/01/01 1899/12/31
2 1900/01/02 1900/01/01
…
59 1900/02/28 1900/02/27
60 1900/02/29(!) 1900/02/28
61 1900/03/01 1900/03/01
Excel не распознает отрицательные даты и имеет специальное определение нулевого января (1899/12/31) для нулевого дня. Внутренне Excel действительно обрабатывает отрицательные даты (в конце концов, это просто числа), но он отображает их как числа, поскольку не знает, как отображать их как даты (и при этом он не может преобразовать более старые даты в отрицательные числа). 29 февраля 1900 года, день, которого никогда не было, признается Excel, но не LibreOffice.