|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Oleg Alistratov 2:4648/1.20 05 Jan 2001 04:41:00 To : M.Babakov@sochi.net.ru Subject : Работа с датой и временем... -------------------------------------------------------------------------------- ъъъ 03 Jan 01 ъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъ єГДъ письмо от *M.Babakov@sochi.net.ru* к *All* ъДД >> Кто и как работает с датами (сравнить диапазон, прибавить дней - >> часов). P.S. DateCalc не предлагать... ??? причины религиозные? ;-) Как-то мне пришлось написать свои Days_In_Month и Day_Of_Week, потому что хостер ленился прикрутить Date::Calc. Вот, огрызки этого скрипта остались в живых, думаю, разберешься. Все делается через функцию Encode_Date, которая превращает список (год, месяц, день) в целое = количество дней с 1.01.0001 Эти числа можешь складывать, вычитать и делить в столбик ;-) Как написать Decode_Date - сам разберешься, если нет, свистни, вышлю мылом. Код не очень кузявый, потому что переводил с Си, на котором написал библиотечку а-ля TDateTime из Борландовского VCL, а там я во всю использовал указатели. Могу выслать сишные сорцы, там еще кое-что полезное есть. ДД _WO_DATE_CALC.PL_ ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД #!/usr/bin/perl -w # -------------------------------------------------------------------- my @mLeap = (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); my @mNoLeap = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); # -------------------------------------------------------------------- sub Encode_Date { my ($year, $month, $day) = @_; my $xdate = 0; my $leap = Is_Leap_Year($year); if ( ($year >= 1) && ($year <= 9999) && ($month >= 1) && ($month <= 12) && ($day >= 1) && ($day <= ($leap ? $mLeap[$month - 1] : $mNoLeap[$month - 1])) ) { my $i; for ($i = 0; $i < $month - 1; $i++) { $day += ($leap ? $mLeap[$i] : $mNoLeap[$i]); } $i = $year - 1; $xdate = $i * 365 + $i / 4 - $i / 100 + $i / 400 + $day; } return $xdate; } # -------------------------------------------------------------------- sub Is_Leap_Year { return (($_[0] % 4 == 0) && (($_[0] % 100 != 0) || ($_[0] % 400 == 0))) ? 1 : 0; } # -------------------------------------------------------------------- sub Days_in_Month { return Is_Leap_Year($_[0]) ? $mLeap[$_[1] - 1] : $mNoLeap[$_[1] - 1]; } # -------------------------------------------------------------------- sub Day_of_Week { my $d = Encode_Date(@_) % 7; $d = 7 if (!$d); return $d; } # -------------------------------------------------------------------- ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД Олег Алистратов AKA Али <oali@mail.ru> [Team Выспаться] --- С моих слов записано верно. * Origin: Ходют тут всякие, а потом плавки пропадают... (2:4648/1.20) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/27353a5544f3.html, оценка из 5, голосов 22
|