Forum Webscript.Ru

Программирование => Perl => Тема начата: от 05 Апреля 2002, 10:50:32

Название: Дата в Perl
Отправлено: от 05 Апреля 2002, 10:50:32
получаю текущую дату:
 ($day,$mon,$year) = (localtime(time))[3,4,5];
 $year -= 100;  
 $mon;
 if ($mon<=0) {$mon=12; $year=$year-1;}
 $adate = sprintf("%02d.%02d.%02d",$day,$mon,$year);
(выше - это чтобы привести дату к формату dd.mm.yy)

читаю вторую дату из БД:
 $dates=$row{\'DATA_IN\'};

теперь их нужно сравнить:
 if ($dates >= $adate) {$news=\'new\';} else {$news=\'\';}

но сравнение не работает :-(
подскажите, где ошибка?
Название: Дата в Perl
Отправлено: glebushka от 05 Апреля 2002, 11:48:09
Цитировать
но сравнение не работает :-(

Да сравнение как раз должно работать:)
Да и дату ты ищешь правильно...
А вот насчёт БД  я не уверен, на всякий случай проверь:
print "$dates\\n";
Там вообще дата, и того ли она формата?
Название: Дата в Perl
Отправлено: от 05 Апреля 2002, 11:58:57
проверял... обе даты (из базы и текущая) выводятся нормально.
может нужно сравнивать даты, а не строки? Я не совсем понимаю в каком формате $dates и $adate.
Название: Дата в Perl
Отправлено: Green Kakadu от 05 Апреля 2002, 12:02:50
Цитировать
dd.mm.yy

ээ, а может лучше в секундах оставлять для сравнения?
:)
Название: Дата в Perl
Отправлено: glebushka от 05 Апреля 2002, 12:23:30
Ну вот я сочинил вроде прогу:
Смотри по адресу:
http://www.glebushka.hut.ru/cgi-bin/hot/date.cgi
Код проги:
#!/usr/bin/perl
($day,$mon,$year) = (localtime(time))[3,4,5];
$year -= 100;
$mon;
if ($mon<=0) {$mon=12; $year=$year-1;}
$adate = sprintf("%02d.%02d.%02d",$day,$mon,$year);
print "Content-Type: text/html; Charset=windows-1251\\n\\n";
print "$adate\\n";
$date2 = 06.04.02;
if ($adate >= $date2){
print "$adate\\n";
}else{
$verdad = \'\';
print "Да работает ведь сравнение!!!\\n";
}
Во! Чего тебе не нравиться?
Название: Дата в Perl
Отправлено: NeoNox от 05 Апреля 2002, 12:35:46
Absolute Perl выругался следующими словами:

Useless use of a variable in void context at noname.pl line 4.
Name "main::verdad" used only once: possible typo at noname.pl line 13.
Argument "05.03.02" isn\'t numeric in numeric ge (>=) at noname.pl line 10.

ЗЫ. noname.pl здесь - это твой скрипт.
Название: Дата в Perl
Отправлено: glebushka от 05 Апреля 2002, 12:45:48
Ну вообще конечно правпильно ругается, насчёт 4...
насчёт $verdad тоже надо "" вместо \'\'
Ну можно и ge написать и вравнивать строки, если он так трепетно к этому относится, но в общем и целом он должен работать!
Название: Дата в Perl
Отправлено: от 05 Апреля 2002, 13:05:07
очень странно... этот фрагмент действительно работает!

но у меня в скрипте - ни в какую...((
вот, например, что выдает:
21.03.01 >= 05.03.02   - истина
03.01.02 >= 05.03.02   - ложь
22.03.01 >= 05.03.02   - истина
03.02.02 >= 05.03.02   - ложь

где первая дата - $dates, а вторая - $adate (сегодняшняя)
Название: Дата в Perl
Отправлено: glebushka от 05 Апреля 2002, 13:11:20
Цитировать
вот, например, что выдает:
21.03.01 >= 05.03.02 - истина
03.01.02 >= 05.03.02 - ложь
22.03.01 >= 05.03.02 - истина
03.02.02 >= 05.03.02 - ложь

И правильно делает!!!!!!!!
1) 21>05 - Однозначно! (месяц одинаковый, сраниваем даты)
2) 1>3 - ФУФЛО! (месяцы разные, сравниваем месяцы)
3) 22>05 - Однозначно! (ну и т.д.)
4) 3>5 - ФУФЛО!
Ну всё правильно тебе выдал, чего тебе не нравится?
Так что ты переработал:))))
Кстати учти замечания NeoNox, а то код действительно кривой какой-то...
Название: Дата в Perl
Отправлено: от 05 Апреля 2002, 13:29:36
ну вы даете! а год уже никого не интересует?
21.03.01 >= 05.03.02    - это правильно?

меня интересуют все даты за последний месяц. вот за этим и произвожу сравнение.  :-)
Название: Дата в Perl
Отправлено: от 05 Апреля 2002, 14:41:17
Печальное событие, господа! У меня Perl при условии:

  if ($dates >= $adate) {$news=\'new\';} else {$news=\'\';}

сравнивает только дни.

Битва с этим проста:
  разложить дату и сравнивать поэлементно.
  if (($y >= $year) && ($m >= $mon) && ($d >= $day))

Большое всем спасибо! ;-))
Название: Дата в Perl
Отправлено: NeoNox от 05 Апреля 2002, 14:48:52
Цитировать
Битва с этим проста:

Она еще проще будет если сравнивать числа в формате localtime. ;) А потом уже их "раскладывать" на дни. месяц и год...
Название: Дата в Perl
Отправлено: Chs от 05 Апреля 2002, 15:18:35
Цитировать
разложить дату и сравнивать поэлементно.

:)) Сравнивать надо просто в формате yymmdd или как сказал NeoNox.
Название: Дата в Perl
Отправлено: Kostya от 05 Апреля 2002, 17:09:22
$data1=\'01.02.02\';
$data2=\'01.02.03\';
if(join(".",reverse split(/\\./,$data1)) ge join(".",reverse split(/\\./,$data2)))
{ print ">=\\n"; }
else { print "<\\n"; }
Конечно, если даты прошлого века не попадаются
Название: Дата в Perl
Отправлено: от 06 Апреля 2002, 02:12:44
>> 21.03.01 >= 05.03.02 - это правильно?

Конечно правильно. ">=" операция сравнения чисел, пререводим строки в числа:

1) 21.03.01
"2" - цифра, полет нормальный
"1" - цифра, полет нормальный
"." - точка, также может являться частью числа
"0" - пошла десятичная часть, все в порядке
"3" - продолжение десятичной части
"." - еще одна точка, ни в одном из форматов записи числа двух точек быть не может, ошибка, заканчиваем.
 в итоге имеем число - "21.03".

Получить число из "05.03.02" и сравнить оставляется в качестве домашнего задания.
Название: Дата в Perl
Отправлено: от 06 Апреля 2002, 02:19:24
>> Сравнивать надо просто в формате yymmdd

Даже если сравнивать в формате yymmdd, надо сравнивать строки, потому что "02.01.25" == "02.01.24" => TRUE
Название: Дата в Perl
Отправлено: NeoNox от 07 Апреля 2002, 14:39:03
Цитировать
Даже если сравнивать в формате yymmdd, надо сравнивать строки, потому что "02.01.25" == "02.01.24" => TRUE

А формат записи ты внимательно посмотрел?
Не 02.01.25 а 020125. Разницу заметно?
Название: Дата в Perl
Отправлено: от 07 Апреля 2002, 21:46:38
Теперь заметно. Но во всей ветке обсуждали именно 02.01.25, и я думаю, не я один этот момент упустил. А если сравнивать как строки, то тогда не важно, есть там точки или нет.
Название: Дата в Perl
Отправлено: DSA от 22 Июля 2005, 23:14:29
Для работы с датой есть модуль на CPAN. http://search.cpan.org/src/DSAMZA/EasyDate-102/EasyDate.pm