Linux bash сравнение дат

Linux bash сравнение дат

Как сравнить две даты в sh, в формате 2011-11-11 11:11:11?

Ответить | Правка | Cообщить модератору

Оглавление

  • Как сравнить две даты, Aleksey, 20:59 , 03-Июл-11, ( 1 ) +1
  • Как сравнить две даты, Aquarius, 22:13 , 03-Июл-11, ( 2 )
    • Как сравнить две даты, Алексей, 00:01 , 04-Июл-11, ( 3 )
      • Как сравнить две даты, Алексей, 00:14 , 04-Июл-11, ( 4 )
        • Как сравнить две даты, Алексей, 00:19 , 04-Июл-11, ( 5 )
          • Как сравнить две даты, Etch, 06:53 , 04-Июл-11, ( 6 )
            • Как сравнить две даты, Алексей, 13:35 , 04-Июл-11, ( 7 )

Сообщения по теме [Сортировка по времени | 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

> Как сравнить две даты в sh, в формате 2011-11-11 11:11:11?

в этом формате можно использовать строчное сравнение

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3 . «Как сравнить две даты» + / –
Сообщение от Алексей (??) on 04-Июл-11, 00:01

>> Как сравнить две даты в sh, в формате 2011-11-11 11:11:11?

спасибо, просто пытался и в секунды переводить и строкой все никак не получалось.
потом нашел что нужно сравнение экранировать.
[ «$today_date» \> «$start_date» ]

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4 . «Как сравнить две даты» + / –
Сообщение от Алексей (??) on 04-Июл-11, 00:14

`date -d «$expiration_date» +%s`
а вот тут, мне нужно для суммирования дат, я так и не одолел
почему-то все время ошибка лезет, а именно не воспринимает параметр в команде date

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5 . «Как сравнить две даты» + / –
Сообщение от Алексей (??) on 04-Июл-11, 00:19

date -d «2011-11-11 00:00:00» +%s
даже так написанное в строке выскакивает ошибка
date -d 99999999
выводит дату

Источник

Получение разницы между датами 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 и прочие сложности? Количество месяцев в любом году же, вроде бы, постоянно, не?

Необходимо получить разницу в количестве месяцев между двумя датами вида dd/mm/yyyy

А скорость получения важна? 🙂

Или я задачу не понял? Судя по тому, как тут все ее серьезно обсуждают, это весьма возможно.

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: Разница двух дат в количестве дней

Ну можете предложить вариант с использованием массивов.
В один массив загоняете кол-во дней от начало отсчета до 1-го января года, допустим:
a=(0 366 731) и используете ГГ как индекс по этому массиву.
Подразумевается, что скрипт должен работать в небольшом диапазоне дат, допустим 2000-2100.

Другим массивом переводите месяц в число дней от начала года b=(0 31 59)
И список, котоый содержит все високосные года, если месяц > 2 и год в этом списке, то добавляем ещё один день.
Каждую дату переводим в число дней от начала отсчёта и определяем разность.

P.S. Пластиковой карточки нет и наверное не будет.

Re: Bash: Разница двух дат в количестве дней

В формулировках не силён. Задание какое есть. Было чётко сказано только; 1) Использовать только bash. 2) Важна как скорость работы так и точность. PS. Я и не говорил что, я такой профессионал, я только учусь. Много не знаю. Потому и попросил помощи.

Re: Bash: Разница двух дат в количестве дней

>2) Важна как скорость работы так и точность.

Вот видишь, скорость работы, а не какие-то «операции».

Re: Bash: Разница двух дат в количестве дней

Как уже сказал, я не силён в формулировках. :-[ Прошу прощения, за некорректно составленный вопрос.

Re: Bash: Разница двух дат в количестве дней

Да-да, у меня тоже есть быстрый бинарник, который будет невероятно быстро даты считать. Только ему обязательно на входе еще и номер счета вводить, с которым выполняется банковская операция. Устроит?

Re: Bash: Разница двух дат в количестве дней

Источник

Читайте также:  Открыть порт командой linux
Оцените статью