Подсчитать количество дней между датами (Velocity)

Модератор: Модераторы разделов

Ответить
Аватара пользователя
nerve
Сообщения: 280
ОС: OpenBSD

Подсчитать количество дней между датами

Сообщение nerve »

Используется Velocity.
Исходно доступны две даты как Integer, вида yyyymmdd.
В пределах одного месяца могу посчитать вычитанием большей даты из меньшей.
А как посчитать если отличаются месяцы?
Нужна хотя бы идея в виде псевдокода.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Подсчитать количество дней между датами

Сообщение Bizdelnick »

Преобразовать в unix timestamp?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
nerve
Сообщения: 280
ОС: OpenBSD

Re: Подсчитать количество дней между датами

Сообщение nerve »

доступен только базовый Велосити синтаксис.
нашел весьма доступный алгоритм.
попробую с его помощью.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Подсчитать количество дней между датами

Сообщение NickLion »

А почему доступен только базовый Velocity? Проблема передать туда объект типа GregorianCalendar и воспользоваться его методами? Или воспользоваться https://velocity.apache.org/tools/devel/api...c/DateTool.html ?

А если очень хочется велосипедить, то считаем дни в полных годах, которые прошли между датами (по номеру года — 365 или 365), потом полные месяцы недостающие (феврали с учётом года), и дни в неполных месяцах. Если даты всегда недалеко, то можно только по месяцам считать.
Спасибо сказали:
Аватара пользователя
nerve
Сообщения: 280
ОС: OpenBSD

Re: Подсчитать количество дней между датами

Сообщение nerve »

NickLion писал(а):
19.07.2016 00:42
А почему доступен только базовый Velocity?

ну так наверно решили разработчики.
то есть класс DateTool не доступен.

даты в 99.9% случаях принадлежат одному году. то есть можно принять, что разницу в днях между годами нам считать не нужно.

можете для совсем тугих разжевать как считать в таком случае? все равно ведь надо определять високосный сейчас год или нет и как-то определять в каком месяце 30 дней, а в каком 31.

Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Подсчитать количество дней между датами

Сообщение NickLion »

Для месяцев можно просто завести массив:

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

#set($dayInMonth=[31,28,31,30,31,30,31,31,30,31,30,31])
(не забудьте -1 для номера месяца)
Високосность считается по номеру года, если год делится на 4, но не делится на 100, или делится на 400, то он високосный.
Спасибо сказали:
Аватара пользователя
nerve
Сообщения: 280
ОС: OpenBSD

Re: Подсчитать количество дней между датами

Сообщение nerve »

Не могу сообразить как посчитать количество дней в месяцах, предшествующих текущему месяцу.
в данном случае конструкция for и обращение к массиву используют сишный синтаксис и я их вставил для примера.
но в велосити это разумеется не годится.
общую логику подсчета взял из ссылки выше.

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

## @noparams

#set ( $Integer = 0 )
#set ( $CurrentYear = 2020 )
#set ( $Date = 2016724 )
#set ( $DayInMonth = [31,28,31,30,31,30,31,31,30,31,30,31] )
#set ( $Day1 = 24 )
#set ( $Day2 = 30 )
#set ( $Month1 = 1 )
#set ( $Month2 = 7 )
#set ( $Year1 = 2000 )
#set ( $Year2 = 2004 )

#if ( $CurrentYear % 4 != 0 || $CurrentYear % 100 == 0 && $CurrentYear % 400 != 0  )
$CurrentYear is Not leap
#else
$CurrentYear is leap
#end
<br>

#if ( $Month1 > 2 )
#set ( $LeapYears1 = ( $Year1 / 4 ) -  ( $Year1 / 100 ) + ( $Year1 / 400 ) )
LeapYears1 is $LeapYears1.
<br>
#else
#set ( $LeapYears1 = ( ( $Year1 - 1 ) / 4 ) -  ( ( $Year1 - 1 ) / 100 ) + ( ( $Year1 - 1 ) / 400 ) )
LeapYears1 is $LeapYears1.
<br>
#end

#if ( $Month2 > 2 )
#set ( $LeapYears2 = ( $Year2 / 4 ) -  ( $Year2 / 100 ) -  ( $Year2 / 400 ) )
LeapYears2 is $LeapYears2.
<br>
#else
#set ( $LeapYears2 = ( ( $Year2 - 1 ) / 4 ) -  ( ( $Year2 - 1 ) / 100 ) -  ( ( $Year2 - 1 ) / 400 ) )
LeapYears2 is $LeapYears2.
<br>
#end

#set ( $Days1 = $Year1 * 365 + $LeapYears1 + $Day1 )
for ( i = 0; i < ( $Month1 -1 ); i++ ) <<<<< incorrect syntax
#set ( $Days1  += $DayInMonth[i] ) <<<<< incorrect syntax

#set ( $Days2 = $Year2 * 365 + $LeapYears2 + $Day2 )
for ( i = 0; i < ( $Month2 -1 ); i++ )  <<<<< incorrect syntax
#set ( $Days2  += $DayInMonth[i] )  <<<<< incorrect syntax

#set ( $Diff = $Days2 - $Days1 )

выхлоп

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

2020 is leap
LeapYears1 is 484.
LeapYears2 is 476.
Спасибо сказали:
Аватара пользователя
nerve
Сообщения: 280
ОС: OpenBSD

Re: Подсчитать количество дней между датами

Сообщение nerve »

в общем как-то так

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

## @noparams

#set ( $Integer = 0 )
#set ( $CurrentYear = 2020 )
#set ( $Date = 2016724 )
#set ( $DayInMonth = [31,28,31,30,31,30,31,31,30,31,30,31] )
#set ( $Day1 = 24 )
#set ( $Day2 = 2 )
#set ( $Month1 = 7 )
#set ( $Month2 = 8 )
#set ( $Year1 = 2016 )
#set ( $Year2 = 2016 )

#if ( $CurrentYear % 4 != 0 || $CurrentYear % 100 == 0 && $CurrentYear % 400 != 0  )
$CurrentYear is Not leap
#else
$CurrentYear is leap
#end
<br>

#if ( $Month1 > 2 )
#set ( $LeapYears1 = ( $Year1 / 4 ) -  ( $Year1 / 100 ) + ( $Year1 / 400 ) )
LeapYears1 is $LeapYears1.
<br>
#else
#set ( $LeapYears1 = ( ( $Year1 - 1 ) / 4 ) -  ( ( $Year1 - 1 ) / 100 ) + ( ( $Year1 - 1 ) / 400 ) )
LeapYears1 is $LeapYears1.
<br>
#end

#if ( $Month2 > 2 )
#set ( $LeapYears2 = ( $Year2 / 4 ) -  ( $Year2 / 100 ) + ( $Year2 / 400 ) )
LeapYears2 is $LeapYears2.
<br>
#else
#set ( $LeapYears2 = ( ( $Year2 - 1 ) / 4 ) -  ( ( $Year2 - 1 ) / 100 ) + ( ( $Year2 - 1 ) / 400 ) )
LeapYears2 is $LeapYears2.
<br>
#end

#set ( $Days1 = ( ( $Year1 * 365 ) + $LeapYears1 + $Day1 ) )
$Days1 <br>
#set ( $Days2 = ( ( $Year2 * 365 ) + $LeapYears2 + $Day2 ) )
$Days2 <br>

#set ( $LoopCount1 = ( $Month1 - 1 ) )
$LoopCount1 <br>
#set ( $LoopCount2 = ( $Month2 - 1 ) )
$LoopCount2 <br>

#if ( $LoopCount1 == 0 )
      #set ( $Days1 = $Days1 )
 #else
   #foreach ( $m in $DayInMonth )
         #if ( $velocityCount > $LoopCount1 )
           #break
        #end
      #set ( $Days1 = ( $Days1 + $m ) )
   #end
#end

#if ( $LoopCount2 == 0 )
      #set ( $Days2 = $Days2 )
 #else
   #foreach ( $m in $DayInMonth )
         #if ( $velocityCount > $LoopCount2 )
           #break
        #end
      #set ( $Days2 = ( $Days2 + $m ) )
   #end
#end

#set ( $Diff = ( $Days2 - $Days1 ) )
<br>
Difference between $Day1.$Month1.$Year1 and $Day2.$Month2.$Year2 is $Diff.


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

2020 is leap
LeapYears1 is 489.
LeapYears2 is 489.
736353
736331
6
7

Difference between 24.7.2016 and 2.8.2016 is 9.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Подсчитать количество дней между датами

Сообщение NickLion »

Я бы написал что-то вроде:

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

#set($dayInMonth=[31,28,31,30,31,30,31,31,30,31,30,31])

#set($year1=2015)
#set($month1=12 - 1)
#set($day1=31)
#set($year2=2016)
#set($month2=1 - 1)
#set($day2=1)

#set($dd=$day2 - $day1)
##$dd
#foreach($year in [$year1..$year2])
##    year $year
    #if($year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0)
        #set($leap=1)
    #else
        #set($leap=0)
    #end
##    leap $leap
    #if($year == $year1)
        #set($m1=$month1)
    #else
        #set($m1=0)
    #end
##    m1 $m1
    #if($year == $year2)
        #set($m2=$month2 - 1)
    #else
        #set($m2=11)
    #end
##    m2 $m2
    #if($m2 >= $m1)
    #foreach($month in [$m1..$m2])
##        month $month
        #set($dd=$dd + $dayInMonth[$month] + $leap)
##        cur dd ($dd)
    #end
    #end
#end

answer $dd
Спасибо сказали:
Ответить