Я хотел бы написать сценарий или функцию, чтобы сказать мне, сколько дней с этого момента и до данной даты в будущем. То, что я изо всех сил пытаюсь выяснить, - это как обработать данную дату и сравнить ее с текущей датой ... Я представляю что-то вроде
read -p "enter the date in the format YYYY-MM-DD "
И тогда я предполагаю, что у меня есть строка, которая не имеет смысла для оболочки, и я должен сделать некоторые оценки, как ... ?? (Это всего лишь пример; я думаю, bc
это будет необходимо)
i=$(($(date +%Y)-${REPLY%%-*}))
j=$(($(date +%m)-${REPLY:5:2}))
k=$(($(date +%d)-${REPLY##*-}))
И тогда я не знаю, что делать с этими числами ... ??
if $i > 1 then assign l=$((i*365)) and else what?? # what about leap years?
Using $j somehow assign m # confused before I've started
Using $k somehow assign n # just as bad
echo $((l+m+n))
Я, конечно, делаю это слишком трудно для себя; Вероятно, есть инструмент обработки текста, который понимает даты и может сравнивать их.
Как я могу это сделать?
Ответы:
Время эпохи
В общем, расчеты по времени наиболее просты, если сначала преобразовать время в (Unix) время эпохи (секунды 1-1-1970). В Python у нас есть инструменты для преобразования времени в эпоху и обратно в любой формат даты, который мы предпочитаем.
Мы можем просто установить формат, например:
... и определим сегодня:
и впоследствии напишите функцию для выполнения работы:
Тогда вывод:
... который, как уже упоминалось, количество секунд с 1-1-1970
Расчет дней между двумя датами
Если мы сделаем это как сегодня, так и в будущем, рассчитайте разницу:
Выходные данные будут рассчитаны по дате , так как мы используем формат
%Y-%m-%d
. Округление по секундам может привести к неправильной разнице в датах, если мы, например, около 24 часов.Терминальная версия
... и вариант Zenity
И просто для удовольствия ...
Крошечное приложение. Добавьте его в ярлык, если вы часто его используете.
Сценарий:
orangedays.py
Запустить его:
Завернуть это
Используйте для крошечного сценария приложения выше следующий
.desktop
файл:orangedays.desktop
в~/.local/share/applications
В соответствии
установить фактический путь к сценарию ...
источник
GNU
date
утилита довольно хорошо такого рода вещи. Он может анализировать множество форматов дат и затем выводить их в другом формате. Здесь мы используем%s
для вывода количество секунд с начала эпохи. Тогда нужно просто вычесть$now
из арифметики$future
и разделить на 86400 секунд / день:источник
-u
параметр вdate
.Вы можете попробовать сделать что-то
awk
, используяmktime
функциюAwk ожидает чтения даты из стандартного ввода в формате «ГГГГ ММ ДД ЧЧ ММ СС» и затем выводит разницу между указанным временем и текущим временем в днях.
mktime
просто преобразует время (в указанном формате) в количество секунд от эталонного времени (1970-01-01 00:00:00 UTC); systime simple указывает текущее время в том же формате. Вычтите одно из другого, и вы получите, как далеко они разойдутся за секунды. Разделите на 86400 (24 * 60 * 60), чтобы преобразовать в дни.источник
Вот версия Ruby
Пример выполнения:
Пример запуска скрипта
ruby ./day-difference.rb
приведен ниже (при условии, что вы сохранили его какday-difference.rb
)С будущей датой
С прошедшей датой
Когда прошла сегодняшняя дата
Вот хороший сайт для проверки различий в дате http://www.timeanddate.com/date/duration.html
источник
Есть
dateutils
пакет, который очень удобен для работы с датами. Подробнее об этом читайте здесь github: dateutilsУстановите его
sudo apt install dateutils
Для вашей проблемы, просто
dateutils.ddiff <start date> <end date> -f "%d days"
где выходные данные могут быть выбраны в виде секунд, минут, часов, дней, недель, месяцев или лет. Это может быть удобно использовано в сценариях, где вывод может использоваться для других задач.
Например,
источник
Вы можете использовать библиотеку awk Velor :
Или:
источник
Короткое решение, если обе даты принадлежат одному и тому же году, это:
используя формат "% j", который возвращает позицию даты в днях в году, т.е. 135 для текущей даты. Это позволяет избежать проблем с округлением и обрабатывает даты в прошлом, давая отрицательные результаты.
Однако пересечь границы года это не удастся. Вы можете добавить (или вычесть) 365 вручную для каждого года или 366 для каждого високосного года, если будет пересекать последний февраль, но это будет почти столь же многословно, как и другие решения.
Вот чистое решение Bash:
Shellcheck предлагает много двойных кавычек, но для дней, превышающих 9999 год, вы должны рассмотреть другой подход. В прошлом он молча провалится до дат до 1970.01.01. Санитарная обработка пользовательского ввода оставлена пользователю в качестве упражнения.
Две функции могут быть преобразованы в одну, но это может усложнить понимание.
Обратите внимание, что сценарий нуждается в исчерпывающем тестировании для корректной обработки високосных лет в прошлом. Я бы не поспорил, что это правильно.
источник