Архивировано

Эта тема находится в архиве и закрыта для публикации сообщений.

Lost-One

Алгоритм: Количество дней между датами

Рекомендованные сообщения

Здравствуйте.

Не подскажет ли кто алгоритм подсчета дней между двумя датами.

 

Желательно попроще так как необходимо его реализовать на *nix Shell Bash.

 

А то я уже нашел парочку, но они какие-то странные...

У одного между 01 марта 2009 и 27 февраля 2009 оказывается 222 дня.

 

Другой не верно высчитывает количство дней в феврале....

Можно конечно делать поправку именно на этот месяц, но

почему-то кажется что должен быть способ более приличный.

 

Помогите, глаз уже замылился, от ссылок в гугле.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну что-ж....

If you want somthing done and done well... Do it yourself !

Если хочешь чтобы что-то было сделано и сделано хорошо... Сделай сам !

 

Может кому пригодится....

Критика приветствуется, только просьба понять, что это мой первый скрипт:

 

#!/bin/bash
#################################################################
#                                                               #
#       Script conting amount of days between two dates         #
#                                                               #
#       This Script reads two parameters: Date1 and Date2       #
#                                                               #
#       Date1 Must be Greater than Date2.                       #
#                                                               #
#       Format of the Dates is: YYYY*MM*DD                      #
#       Where * - Means any symbol                              #
#                                                               #
#       Script was written for gentoo 2.6                       #
#       03-03-2009.                                             #
#                                                               #
#################################################################

Count_days ()
{
 ind=0
 Month=$1
 CD=0
 while [ "$ind" -le "$Month" ];
 do
       # echo ind1 = $ind
       if [ $ind = 1 ] || [ $ind = 3 ] || [ $ind = 5 ] || [ $ind = 7 ] || [ $ind = 8 ] || [ $ind = 10 ] || [ $ind = 12 ]; then
               CD=$(($CD+31))
       fi
       if [ $ind = 4 ] || [ $ind = 6 ] || [ $ind = 9 ] || [ $ind = 11 ]; then
               CD=$(($CD+30))
       fi
       if [ $ind = 2 ]; then
               CD=$(($CD+28))
       fi
       ind=`expr $ind + 1`
       # echo ind2 = $ind
 done
 return $CD
}
###############################################################
strip_leading_zero () # Удалить ведущий ноль
{
 val=${1#0}          # иначе Bash будет считать числа
 return $val         # восьмеричными (POSIX.2, sect 2.9.2.1).
}
###############################################################
#       Read Parameters         #
####################
Date1=$1
Date2=$2

D1=${Date1:8:2}
M1=${Date1:5:2}
Y1=${Date1:0:4}
strip_leading_zero $D1
strip_leading_zero $M1

D2=${Date2:8:2}
M2=${Date2:5:2}
Y2=${Date2:0:4}
strip_leading_zero $D2
strip_leading_zero $M2


CVY=0           # Amount of long years
##########################
#       Function Checking Long Year     #
##########################
function CheckLY ()
{
       Yrs=$1

       if [ $(($Yrs%4)) = 0 ] && [ $(($Yrs%100)) -ne 0 ]; then
               CVY=$(($CVY+1))
       else
          if [ $(($Yrs%100)) = 0 ] && [ $(($Yrs%400)) = 0 ]; then
               CVY=$(($CVY+1))
          else
               CVY=$(($CVY+0))
          fi
       fi
}
##########################################

Y=$(($Y1-$Y2))

if [ 0 -lt "$Y" ]; then
       ind=0
       TstY=$Y2
       while [ $ind -lt $Y ]; do
               CheckLY $TstY
               TstY=$(($TstY+1))
               ind=$(($ind+1))
       done
       if [ $M1 -gt 2 ] && [ $M2 -gt 2 ]; then
               CVY=$(($CVY-1))
       fi

else
       if [ $M1 -gt 2 ] && [ $M2 -le 2 ]; then
               CheckLY $Y1
       else
               :
       fi
fi

M1=$(($M1-1))
Count_days $M1
M1CD=$?
CD1=$(($M1CD+$D1))
#echo CD1 = $CD1

M2=$(($M2-1))
Count_days $M2
M2CD=$?
CD2=$(($M2CD+$D2))
#echo CD2 = $CD2

ColDays=$((365*Y+$CVY+$CD1-$CD2))
echo $ColDays


exit
#########################
#       The End         #
#########################

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а на перле не проще было?

он во всех никсах обычно присутствует

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
echo \(`date +%s -d "Mar 1, 2009 00:00:01"` - `date +%s -d "Feb 27, 2009 00:00:01"`\)/\(60*60*24\) | bc -l

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах