- Linux bash сравнение дат
- Получение разницы между датами bash
- Как сравнить две даты в оболочке?
- Как сравнить две даты в оболочке?
- Применение
- конкретный ответ bash
- Bash: Разница двух дат в количестве дней
- Re: Bash: Разница двух дат в количестве дней
- Re: Bash: Разница двух дат в количестве дней
- Re: Bash: Разница двух дат в количестве дней
- Re: Bash: Разница двух дат в количестве дней
- Re: Bash: Разница двух дат в количестве дней
- Re: Bash: Разница двух дат в количестве дней
- Re: Bash: Разница двух дат в количестве дней
- Re: Bash: Разница двух дат в количестве дней
- Re: Bash: Разница двух дат в количестве дней
- Re: Bash: Разница двух дат в количестве дней
- Re: Bash: Разница двух дат в количестве дней
- Re: Bash: Разница двух дат в количестве дней
- Re: Bash: Разница двух дат в количестве дней
- Re: Bash: Разница двух дат в количестве дней
Linux bash сравнение дат
Как сравнить две даты в sh, в формате 2011-11-11 11:11:11?
Ответить | Правка | Cообщить модератору
Оглавление |
|
Сообщения по теме | [Сортировка по времени | RSS] |
> Как сравнить две даты в sh, в формате 2011-11-11 11:11:11?
Например, сравнить даты в секундах:
DATE1=»2011-11-11 11:11:11″
DATE2=»2011-12-12 12:12:12″
if [ «`date -d «$DATE2″ +%s`» -gt «`date -d «$DATE1″ +%s`» ]; then
echo «$DATE2 greater $DATE1»
fi
1 . «Как сравнить две даты» | +1 + / – | |
Сообщение от Aleksey (??) on 03-Июл-11, 20:59 | ||
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору |
2 . «Как сравнить две даты» | + / – | |
Сообщение от Aquarius (ok) on 03-Июл-11, 22:13 | ||
в этом формате можно использовать строчное сравнение | ||
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору |
3 . «Как сравнить две даты» | + / – | |
Сообщение от Алексей | ||
спасибо, просто пытался и в секунды переводить и строкой все никак не получалось. | ||
Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору |
4 . «Как сравнить две даты» | + / – | |
Сообщение от Алексей | ||
| ||
Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору |
5 . «Как сравнить две даты» | + / – | |
Сообщение от Алексей | ||
Источник Получение разницы между датами bashПроблема по мотивам архивного сообщения Получение разницы между датами Необходимо получить разницу в количестве месяцев между двумя датами вида dd/mm/yyyy SDIFF=$((`date -d «$current_date» ‘+%s’` — `date -d «$before_date» ‘+%s’`)) Собственно проблема что date никак не воспринимает формат dd/mm/yyyy и ругается «date: неверная дата «31/12/2015»» Аналогичная ошибка у меня и в примере, которое приведено в том архивном сообщении, которое якобы работало в далеком 2007 году. Система РедХат 6 В man date есть пример с датой в том формате, в котором оно понимает: «2004-02-29 16:21:42». И приведенный пример считает разницу в секундах, а не в месяцах. А в месяцах можно считать двояко. Можно в секундах, затем делить на 30 дней: Переводить в Epoch, разность делить до нужной точности. А зачем вообще все эти date и прочие сложности? Количество месяцев в любом году же, вроде бы, постоянно, не?
А скорость получения важна? 🙂 Или я задачу не понял? Судя по тому, как тут все ее серьезно обсуждают, это весьма возможно. bash -c «python -c \„import datetime;. \“» Глобальная задача проверять срок действия сертификата эцп, хранимого на токене 🙂 срок когда начал действовать сертификат вытянул в виде дата/время из поля Not valid before: Зная, что срок действия сертификата эцп по российскому законодательству 1 год и 3 месяца, или 15 месяцев говоря другими словами, просто проверяю Если (текущая дата — дата сертификата из токена > 14 месяцев) то слать емыл админу что в сервере hostname срок действия сертификата, через месяц закончится. иначе Если (текущая дата — дата сертификата из токена > 15 месяцев) то слать емыл админу что в сервере hostname срок действия сертификата уж кончился. Скрипт засовывается в крон, и раз в день исполняется. Цель всего, заблаговременно понять что сертификат скоро кончится и нужно его перевыпустить. Собственно весь код «скрипта» готов, только последняя часть расчета разницы в датах всё застопорило. Предполагал что «date -d» можно передать дату/время в нужном мне формате (dd/mm/yyyy), а оказывается оно понимает только один определенный вид указанный в man. Решение задачи будет приведение даты в тот вид который надо команде date, точность расчета +/- день роли особой не играет. Источник Как сравнить две даты в оболочке?Как можно сравнить две даты в оболочке? Вот пример того, как я хотел бы использовать это, хотя это не работает как есть: Как мне достичь желаемого результата? Правильный ответ все еще отсутствует: Обратите внимание, что для этого требуется дата GNU. Эквивалентный date синтаксис для BSD date (подобный найденному в OSX по умолчанию) date -j -f «%F» 2014-08-19 +»%s» Вам не хватает формата даты для сравнения: Вам тоже не хватает циклических структур, как вы планируете получать больше дат? Можно использовать стандартное сравнение строк для сравнения хронологического порядка [строк в формате год, месяц, день]. К счастью, когда [строки, которые используют формат YYYY-MM-DD] сортируются * в алфавитном порядке, они также сортируются * в хронологическом порядке. (* — отсортировано или сравнено) Ничего особенного в этом деле не нужно. ура! Это проблема не циклических структур, а типов данных. Эти даты ( todate и cond ) являются строками, а не числами, поэтому вы не можете использовать оператор «-ge» для test . (Помните, что обозначение в квадратных скобках эквивалентно команде test .) Что вы можете сделать, это использовать другую запись для ваших дат, чтобы они были целыми числами. Например: выдаст целое число, например 20130715, 15 июля 2013 г. Затем вы сможете сравнить свои даты с «-ge» и эквивалентными операторами. Обновление: если указаны ваши даты (например, вы читаете их из файла в формате 2013-07-13), то вы можете легко предварительно обработать их с помощью tr. Оператор -ge работает только с целыми числами, которых нет у ваших дат. Если ваш скрипт представляет собой скрипт bash или ksh или zsh, вы можете использовать вместо этого оператор. Этот оператор недоступен в тире или других оболочках, которые не выходят за рамки стандарта POSIX. В любой оболочке вы можете преобразовать строки в числа, соблюдая порядок дат, просто удалив тире. Кроме того, вы можете перейти на традиционные и использовать expr утилиту. Поскольку запуск подпроцессов в цикле может быть медленным, вы можете предпочесть выполнить преобразование, используя конструкции обработки строки оболочки. Конечно, если вы можете получить даты без дефисов, вы сможете их сравнить -ge . Источник Как сравнить две даты в оболочке?Как можно сравнить две даты в оболочке? Вот пример того, как я хотел бы использовать это, хотя он не работает как есть: Как я могу достичь желаемого результата? Правильный ответ по-прежнему отсутствует: Вам не хватает формата даты для сравнения: Вам также не хватает структур цикла, как вы планируете получать больше дат? Можно использовать стандартное сравнение строк для сравнения хронологического упорядочения [строк в формате года, месяца, дня]. К счастью, когда [строки, которые используют формат YYYY-MM-DD] сортируются * в алфавитном порядке, они также сортируются * в хронологическом порядке. (* – сортировка или сравнение) В этом случае ничего не нужно. ура! Это не проблема циклических структур, а типов данных. Эти даты ( todate и cond ) являются строками, а не цифрами, поэтому вы не можете использовать оператор test «-ge». (Помните, что квадратичная нотация эквивалентна командному test ). Вы можете использовать разные обозначения для своих дат, чтобы они были целыми числами. Например: будет генерировать целое число, например, 20130715 на 15 июля 2013 года. Затем вы можете сравнить свои даты с «-ge» и эквивалентными операторами. Обновление: если даны даты (например, вы читаете их из файла в формате 2013-07-13), тогда вы можете легко их обрабатывать с помощью tr. Оператор -ge работает только с целыми числами, которых нет у ваших дат. Если ваш скрипт является сценарием bash или ksh или zsh, вы можете использовать operator вместо этого. Этот оператор недоступен в тире или других оболочках, которые не выходят за рамки стандарта POSIX. В любой оболочке вы можете преобразовать строки в числа, соблюдая порядок дат, просто удалив тире. Кроме того, вы можете пойти традиционным и использовать утилиту expr . Поскольку вызовы подпроцессов в цикле могут быть медленными, вы можете предпочесть сделать преобразование, используя конструкторы обработки строкой оболочки. Конечно, если вы можете получить даты без дефиса в первую очередь, вы сможете сравнить их с -ge . Я конвертирую строки в unix-timestamps (секунды с 1.1.1970 0: 0: 0). Они легко сравниваются даты – это строки, а не целые числа; вы не можете сравнивать их со стандартными арифметическими операторами. один подход, который вы можете использовать, если гарантированно будет разделитель — : Это работает еще в bash 2.05b.0(1)-release . Существует также этот метод из статьи под названием: Простая дата и время в BASH от unix.com. Эти функции являются выдержкой из скрипта в этом потоке! ПрименениеВы можете также использовать встроенную функцию mysql для сравнения дат. Это дает результат в «дни». Просто вставьте значения переменных $DBUSER и $DBPASSWORD соответствии с вашими. конкретный ответ bashПоскольку мне нравится уменьшать вилки и bash , разрешите много трюков, есть моя цель: Это приведет к повторному заполнению обеих переменных $todate и $cond , используя только одну вилку, с выводом date -f — принятия stdio для чтения по одной дате за строкой. Наконец, вы можете разбить свою петлю с помощью Или как функция : Использование встроенного printf bash, который мог бы отображать время даты с секундами от эпохи (см. man bash 😉 В этом скрипте используется только одна вилка. FWIW: на Mac, кажется, что подача только даты типа «2017-05-05» в дату добавит текущее время к дате, и вы получите различную ценность каждый раз, когда вы конвертируете ее в эпоху. для получения более согласованного времени времени для фиксированных дат, включают фиктивные значения в течение часов, минут и секунд: Это может быть странность, ограниченная версией даты, поставляемой с macOS …. проверена на macOS 10.12.6. Источник Bash: Разница двух дат в количестве днейЕсть скрипт, в него среди всех входных параметров подаются две даты в формате: ДД.ММ.ГГ .Необходимо вычислить разницу этих двух дат в количестве дней. Всё было бы просто если бы работала функция date с флагом -d, но у меня на работе функция date имеет в наличии лишь флаги -u и -a. Нашёл вариант рещения своей задачи в Advanced Bash-Scripting Guide: http://www.opennet.ru/docs/RUS/bash_scripting_guide/a14477.html#DAYSBETWEEN . Но там слишком много операций, в то время как у меня на работе требуют, как можно меньше операций и соответсвтенно более быстрое выполнение действия, но в тоже время необходима точность, ибо скрипт будет работать с банковскими пластиковыми картами. Сам уже перегуглил вроде всё что можно, но до сих пор ничего толкового не нашёл. Есть правда и такой вариант: Посчитать отдельно сутки*24*3600, (месяц-1)*30*24*3600, (год-1)*365*24*3600, а потом сравнивать разницу с 365*3600 и делать выводы. Но тут всё равно будет много операций, нужно ещё меньше. Поэтому и прошу совета, может у кого есть идеи, как можно это реализовать ещё лучше. Хочу сразу сказать в задании чётко указано использовать только bash, тотже самый пёрл и его функции использовать нельзя. PS. Заранее спасибо. Re: Bash: Разница двух дат в количестве днейЧто еще за «операции» ? Ты думаешь date -d делает мешьше этих «операций» ? У тебя обычное непонимание всего. Я больше не хочу пользоваться пластиковыми картами. Re: Bash: Разница двух дат в количестве дней>в то время как у меня на работе требуют, как можно меньше операций А скорость «операций» важна?:) Re: Bash: Разница двух дат в количестве дней>А скорость «операций» важна?:) учитывая полностью дилетантскую формулировку требований начальством — вряд ли. Re: Bash: Разница двух дат в количестве дней> Ты думаешь date -d делает мешьше этих «операций» ? date на сях написан, те же операции в шелле медленнее даже не в сто раз. PS Можно узнать какой это банк? Или на счёт банка ты пошутил? Re: Bash: Разница двух дат в количестве дней>функция date с флагом -d, но у меня на работе функция date имеет в наличии лишь флаги -u и -a >ибо скрипт будет работать с банковскими пластиковыми картами Re: Bash: Разница двух дат в количестве дней> Есть скрипт > оответсвтенно более быстрое выполнение действия > скрипт будет работать с банковскими пластиковыми картами Спасибо что предупредил. Срочно все счета перевожу в кэш. Re: Bash: Разница двух дат в количестве дней>но у меня на работе функция date имеет в наличии лишь флаги -u и -a. Поставь на работу date, который умеет. Re: Bash: Разница двух дат в количестве днейБыл у меня код на C для вычисления разницы между датами с учетом високосности (достаточно простой). Если найду, выложу. Вам нужно будет только собрать да и все тут. Re: Bash: Разница двух дат в количестве днейНу можете предложить вариант с использованием массивов. Другим массивом переводите месяц в число дней от начала года b=(0 31 59) P.S. Пластиковой карточки нет и наверное не будет. Re: Bash: Разница двух дат в количестве днейВ формулировках не силён. Задание какое есть. Было чётко сказано только; 1) Использовать только bash. 2) Важна как скорость работы так и точность. PS. Я и не говорил что, я такой профессионал, я только учусь. Много не знаю. Потому и попросил помощи. Re: Bash: Разница двух дат в количестве дней>2) Важна как скорость работы так и точность. Вот видишь, скорость работы, а не какие-то «операции». Re: Bash: Разница двух дат в количестве днейКак уже сказал, я не силён в формулировках. :-[ Прошу прощения, за некорректно составленный вопрос. Re: Bash: Разница двух дат в количестве днейДа-да, у меня тоже есть быстрый бинарник, который будет невероятно быстро даты считать. Только ему обязательно на входе еще и номер счета вводить, с которым выполняется банковская операция. Устроит? Re: Bash: Разница двух дат в количестве днейИсточник |