parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Ладно, сменим вопрос =)

yes 09.03.2004 14:00

Вобщем захотелось мне написать метод, который считает разницу между входной датой и текущей (при необходимости с roll) и возвращает хеш. С той точностью, с которой у казана входящая дата. Т.е. вполне возможно, что с точностью до секунды. Написал основную часть. Ничего другого не придумал, как воспользоваться вложенными один в другой циклами:
Цикл для года, в нем цикл для месяца ... цикл для секунды. Думаю, тут уже понятно, как такая конструкция жрёт память. Да что я говорю, вот кусок (оговорюсь, этот кусок не я вляется полностью рабочим, хочется смысл передать):
  ^for[iyear]($src.year;$now.year){
   ^for[imonth](^if($iyear == $src.year && def $src.month){$src.month}{1};^if($iyear == $now.year){$now.month}{12}){

    $c[^date:calendar[rus]($iyear;$imonth)]
    $c[^table::create{day
^c.menu{^for[i](0;6){^if(def $c.$i){^c.$i.int[]}
}}}]
    $dpm[^c.count[]]

    ^for[iday](^if($imonth == $src.month && $iyear == $src.year && def $src.day){$src.day}{1};^if($imonth == $now.month && $iyear == $now.year){$now.day}{$dpm}){
     ^for[ihour](^if($iday == $src.day && $imonth == $src.month && $iyear == $src.year && def $src.hour){$src.hour}{1};^if($iday == $now.day && $imonth == $now.month && $iyear == $now.year){$now.hour}{24}){
      ^for[iminute](^if($ihour == $src.hour && $iday == $src.day && $imonth == $src.month && $iyear == $src.year && def $src.minute){$src.minute}{1};^if($ihour == $now.hour && $iday == $now.day && $imonth == $now.month && $iyear == $now.year){$now.minute}{60}){
       ^for[isecond](^if($iminute == $src.minute && $ihour == $src.hour && $iday == $src.day && $imonth == $src.month && $iyear == $src.year && def $src.second){$src.second}{1};^if($iminute == $now.minute && $ihour == $now.hour && $iday == $now.day && $imonth == $now.month && $iyear == $now.year){$now.second}{60}){
        $result.seconds_total(^eval($result.seconds_total + 1))
       }
       $result.seconds(^eval($result.seconds_total%60))
       $result.minutes_total(^eval($result.seconds_total\60)[%.0f])
      }
      $result.minutes(^eval($result.minutes_total%60))
      $result.hours_total(^eval($result.minutes_total\60)[%.0f])
     }
     $result.hours(^eval($result.hours_total%60))
     $result.days_total(^eval($result.hours_total\24)[%.0f])
    }
    
    $result.days(^eval($result.days_total%$dpm))
    $result.months_total(^eval($result.days\$dpm)[%.0f])
    $result.months(^eval($result.months_total % 12))
   }
   $result.years(^eval($result.months_total\12)[%.0f])
   $result.years_total($result.years)
  }
Этот код даже разницу в один день хрен знает сколько считает.