Есть ли в Solaris UNIX какой-либо инструмент (поэтому нет инструмента GNU) для вычитания дат? Я знаю, что в Linux у нас есть gawk
что может вычесть одну дату из другой. Но в солярисе максимум у нас есть nawk
(улучшенныйawk
), который не может выполнять вычисления даты. Также я не могу использовать Perl.
Есть ли способ сделать вычисление даты, как 20100909 - 20001010
?
ОБНОВЛЕНИЕ: bc
Умеет ли выполнять расчеты дат?
Ответы:
Вот сценарий awk, который я только что написал, должен работать с awk для POSIX. Вам придется попробовать версию Solaris; помните, что на Solaris также есть две версии Awk, одна в / bin и одна в / usr / xpg4 / bin / awk (я думаю, это nawk).
Передайте строку даты в формате ГГГГммдд, и она будет преобразована в количество секунд с начала эпохи (с небольшим количеством отданных за то, чтобы быть на границах дня). Тогда вы сможете вычесть два.
источник
К сожалению, ни одна из утилит командной строки POSIX не обеспечивает арифметику дат.
date -d
а такжеdate +%s
есть способ, если у вас есть, но они являются расширениями GNU.Существует такая неуклюжая попытка
touch
проверить, что дата не менее n дней в прошлом:(Обратите внимание, что этот код может быть отключен на единицу, если DST запущен или остановлен в интервале, и сценарий выполняется до 1:00.)
Несколько человек в итоге реализовали библиотеки манипулирования датами в Bourne или POSIX. В FAQ по comp.unix.shell есть несколько примеров и ссылок .
Установка инструментов GNU может быть способом наименьшей боли.
источник
Я бы попробовал использовать
date
команду, которая является частью POSIX, так что она почти везде. ОБНОВЛЕНИЕ: К сожалению, кажется, что -d не является частью даты POSIX и, вероятно, не в Solaris. Таким образом, это, вероятно, не ответит на вопрос ОП.Теперь
d1
иd2
являются целыми числами, которые соответствуют секундам с эпохи Unix. Таким образом, чтобы получить разницу между ними, мы вычитаем ($((d1-d2))
в bash) и скрываем все, что хотим. Дни самые простые:Как сделать преобразование, скорее всего, будет другим, если у вас нет bash. Наиболее переносимым способом может быть использование
expr
( страница руководства expix posix ).источник
Для справки , dateutils - моя попытка предоставить набор портативных инструментов, которые охватывают арифметику дат. Ваш пример сводится к
-i
Определяет формат входного сигнала.источник
Вероятно, Perl будет установлен, и достаточно просто получить модули из CPAN , установить их в свой домашний каталог и сослаться на них в своей программе. В этом случае в модуле Date :: Calc есть
Delta_Days
подпрограмма, которая поможет.источник
Дата выпуска GNU на Solaris:
Я говорю это снова:
Слишком много Solaris SysAdmins гордятся тем, что намеренно не устанавливают официальные пакеты от Sun (теперь Oracle), которые делают систему Solaris «GNU-совместимой» при настройке нового хоста. Бьет меня почему.
Дата GNU превосходна и должна быть доступна по умолчанию на любом хосте Solaris, IMHO.
На Солярисе 10
Установите пакет SFWcoreu с компакт-диска Solaris Companion. После установки вы найдете дату GNU в
/opt/sfw/bin/date
На Солярисе 11
Возможно, он уже есть, так как я считаю, что он является частью стандартной установки. Однако он вызывается
gdate
для того, чтобы отличить его от версии даты Солнца.Сделайте это, если не установлено:
источник
/usr/bin/gdate
и/usr/gnu/bin/date
поэтому вы можете использовать его либо по имени , либо $ настройки PATH.Если у вас есть Python:
Вы отметили свой вопрос "gawk", но вы говорите "нет инструментов GNU". У Гоука есть своя арифметика.
источник
питон:
источник
1. Определите дату1 и
%j
дату2 в формате дня года (001..366)2. Рассчитайте разницу с
expr
3. Итак, ответ 32 дня
... или однострочное решение
или
или
источник
С датой BSD для macOS:
источник
Вы можете использовать библиотеку awk Velor, чтобы вернуть разницу в секундах:
Или дни:
источник