Forum Webscript.Ru
Программирование => 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=\'\';}
но сравнение не работает :-(
подскажите, где ошибка?
-
но сравнение не работает :-(
Да сравнение как раз должно работать:)
Да и дату ты ищешь правильно...
А вот насчёт БД я не уверен, на всякий случай проверь:
print "$dates\\n";
Там вообще дата, и того ли она формата?
-
проверял... обе даты (из базы и текущая) выводятся нормально.
может нужно сравнивать даты, а не строки? Я не совсем понимаю в каком формате $dates и $adate.
-
dd.mm.yy
ээ, а может лучше в секундах оставлять для сравнения?
:)
-
Ну вот я сочинил вроде прогу:
Смотри по адресу:
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";
}
Во! Чего тебе не нравиться?
-
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 здесь - это твой скрипт.
-
Ну вообще конечно правпильно ругается, насчёт 4...
насчёт $verdad тоже надо "" вместо \'\'
Ну можно и ge написать и вравнивать строки, если он так трепетно к этому относится, но в общем и целом он должен работать!
-
очень странно... этот фрагмент действительно работает!
но у меня в скрипте - ни в какую...((
вот, например, что выдает:
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 (сегодняшняя)
-
вот, например, что выдает:
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, а то код действительно кривой какой-то...
-
ну вы даете! а год уже никого не интересует?
21.03.01 >= 05.03.02 - это правильно?
меня интересуют все даты за последний месяц. вот за этим и произвожу сравнение. :-)
-
Печальное событие, господа! У меня Perl при условии:
if ($dates >= $adate) {$news=\'new\';} else {$news=\'\';}
сравнивает только дни.
Битва с этим проста:
разложить дату и сравнивать поэлементно.
if (($y >= $year) && ($m >= $mon) && ($d >= $day))
Большое всем спасибо! ;-))
-
Битва с этим проста:
Она еще проще будет если сравнивать числа в формате localtime. ;) А потом уже их "раскладывать" на дни. месяц и год...
-
разложить дату и сравнивать поэлементно.
:)) Сравнивать надо просто в формате yymmdd или как сказал NeoNox.
-
$data1=\'01.02.02\';
$data2=\'01.02.03\';
if(join(".",reverse split(/\\./,$data1)) ge join(".",reverse split(/\\./,$data2)))
{ print ">=\\n"; }
else { print "<\\n"; }
Конечно, если даты прошлого века не попадаются
-
>> 21.03.01 >= 05.03.02 - это правильно?
Конечно правильно. ">=" операция сравнения чисел, пререводим строки в числа:
1) 21.03.01
"2" - цифра, полет нормальный
"1" - цифра, полет нормальный
"." - точка, также может являться частью числа
"0" - пошла десятичная часть, все в порядке
"3" - продолжение десятичной части
"." - еще одна точка, ни в одном из форматов записи числа двух точек быть не может, ошибка, заканчиваем.
в итоге имеем число - "21.03".
Получить число из "05.03.02" и сравнить оставляется в качестве домашнего задания.
-
>> Сравнивать надо просто в формате yymmdd
Даже если сравнивать в формате yymmdd, надо сравнивать строки, потому что "02.01.25" == "02.01.24" => TRUE
-
Даже если сравнивать в формате yymmdd, надо сравнивать строки, потому что "02.01.25" == "02.01.24" => TRUE
А формат записи ты внимательно посмотрел?
Не 02.01.25 а 020125. Разницу заметно?
-
Теперь заметно. Но во всей ветке обсуждали именно 02.01.25, и я думаю, не я один этот момент упустил. А если сравнивать как строки, то тогда не важно, есть там точки или нет.
-
Для работы с датой есть модуль на CPAN. http://search.cpan.org/src/DSAMZA/EasyDate-102/EasyDate.pm