Расчет дней между датами

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Vlad5503
сержант
Сообщения: 226
Зарегистрирован: 2010-03-25 5:41:41

Расчет дней между датами

Непрочитанное сообщение Vlad5503 » 2017-06-16 5:46:28

Вот появилась такая задача - Вычислить количество дней между датами регистрации оборудования в сети.
Не попалось мне тут близкой темы на этот счет поэтому создаю...
Вот такой скрипт составлен:

Код: Выделить всё

dt=`date "+%Y-%m-%d"`
for R in 0 1 2 3 4 5 6 7 8 9
            do
            echo `snmpwalk -v2c -c $pass $ip 1.3.6.1.4.1.2011.6.128.1.1.2.101.1.6.$pon.$id.$R` | grep "STRING" >> /usr/scripts/dateont.txt
            done
            #vivod posledney stroki registracii ont
            dot=`cat /usr/scripts/dateont.txt |tail -1 | awk '{print $4 " " $5}'`
            #echo $dot
            #dot=`cat /usr/scripts/dateont.txt |tail -1 | awk '{print $4}' | sed 's/"//g'`
                dot1=`echo $dot | awk '{print $1}' | sed 's/"//g'`
                echo $dot1
                if [ $dot1 != 0 ]
                then {
                echo $dt
                sleeptime=$((($dt - $dot1) * "-1"))
                }
                else
                dot1=9999
                fi
                echo $sleeptime
получаем следующее:

Код: Выделить всё

sh dt.sh
2017-06-10
2017-06-16
38
Явно неверно вычисление количества дней.
Проверял на php, на этом же компе, так:

Код: Выделить всё

$datetime1 = date_create('2016-06-10');
$datetime2 = date_create('2017-06-16');
$interval = date_diff($datetime1, $datetime2);
echo $interval->days;
получаю верный результат 6 дней

Код: Выделить всё

php dt.php
6
Вот только надо бы считать на shell/bash. Т.к. исходный скрипт уже годами работает и надо в него встроить. На php делаю разработку аналога всего скрипта, но это дольше будет до получения всего результата...

Может кто-то сталкивался с подобной проблемой подскажите что не так в скрипте...
Может другими методами лучше считать?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Расчет дней между датами

Непрочитанное сообщение xM » 2017-06-16 20:45:15

Через unix epoch считайте в секундах - не промахнётесь.

Код: Выделить всё

man date
+'%s' выдаст вам unix epoch.

Отправлено спустя 11 минут 38 секунд:
Например.
Ваша дата:

Код: Выделить всё

date -jf "%Y-%m-%d" "2017-06-10" +'%s'
1497116616
Текущая в системе:

Код: Выделить всё

root@beta:/home/xm # date +'%s'
1497548624
Полученную разницу делите на число секунд в сутках (86400) и получаете количество полных дней.
IT voodoo blog https://kostikov.co

Vlad5503
сержант
Сообщения: 226
Зарегистрирован: 2010-03-25 5:41:41

Расчет дней между датами

Непрочитанное сообщение Vlad5503 » 2017-06-19 7:33:45

xM писал(а):Через unix epoch считайте в секундах - не промахнётесь.

Код: Выделить всё

man date
+'%s' выдаст вам unix epoch.
....
Благодарствую за подсказку.
В итоге получилось так:

Код: Выделить всё

#!/bin/sh
.....
pon="4194345216"
id="8"
rm /usr/scripts/dateont.txt
dt=`date +'%s'`

#zapros lfn registracii ont
            for R in 0 1 2 3 4 5 6 7 8 9
            do
            echo `snmpwalk -v2c -c $ro $ip 1.3.6.1.4.1.2011.6.128.1.1.2.101.1.6.$pon.$id.$R` | grep "STRING" >> /usr/scripts/dateont.txt
            done
            #vivod posledney stroki registracii ont
            dot=`cat /usr/scripts/dateont.txt |tail -1 | awk '{print $4 " " $5}'`
            dt1=`echo $dot | awk '{print $1}' | sed 's/"//g'`
                if [ $dt1 ]
                then
                dot1=`date -jf "%Y-%m-%d" "$dt1" +'%s'`
                sleeptime=$((($dt - $dot1) / 86400))
                else
                sleeptime="no_time"
                fi
                echo $sleeptime
Т.е. получаем по snmp сведения. Делаем выборку. Проверяем что строка не пустая и далее уже, как Вы подсказали, переводим в секунды.
Ну делаем вычисление.
Спасибо за помощь!!!