Forum Webscript.Ru

Программирование => Perl => Тема начата: Error202 от 02 Декабря 2005, 12:10:03

Название: localtime и undefined value
Отправлено: Error202 от 02 Декабря 2005, 12:10:03
Почему скрипт выдает ошибку:
Can\'t call method "mday" on an undefined value at XX.pl line XX


#!/usr/bin/perl
use Time::localtime;
$y=2001;
$m=11;
@monlens = (0,31,28,31,30,31,30,31,31,30,31,30,31);

$secy=((($y-1900)*365)-int($y/4))*24*60*60;

$secm=0;
for ($i=1; $i<=$m; $i++) { $secm=$secm+$monlens[$i]; };
if ($y%4 != 0) {$secm--;};
$secm=$secm*24*60*60;

$secd=$monlens[$m]*24*60*60;

$first=$secy+$secm;

        $tm=localtime($first);
        $dd=$tm->mday; $mm=$tm->mon+1; $yy=$tm->year+1900;
        $hh=$tm->hour; $min=$tm->min;
        if ($hh<10) {$hh="0$hh";};
        if ($min<10) {$min="0$min";};
        if ($mm<10) {$mm="0$mm";};
        if ($dd<10) {$dd="0$dd";};
        $fs="$hh:$min ($dd.$mm.$yy)";

 $second=$secy+$secm+$secd;

        $tm=localtime($second);
        $dd=$tm->mday; $mm=$tm->mon+1; $yy=$tm->year+1900;
        $hh=$tm->hour; $min=$tm->min;
        if ($hh<10) {$hh="0$hh";};
        if ($min<10) {$min="0$min";};
        if ($mm<10) {$mm="0$mm";};
        if ($dd<10) {$dd="0$dd";};
        $ss="$hh:$min ($dd.$mm.$yy)";

print "Секунды года: $secy\\n";
print "Секунды месяца: $secm\\n";
print "Начало месяца: $first, Конец месяца: $second\\n";
print "Начало месяца: $fs, Конец месяца: $ss\\n";
Название: localtime и undefined value
Отправлено: Phoinix от 02 Декабря 2005, 12:25:24
Error202

Видимо не находит модуль Time::tm...
Название: localtime и undefined value
Отправлено: Error202 от 02 Декабря 2005, 12:29:25
Если вместо $first и $second указать time, то все работает...
Здесь какой-то другой косяк... :(
Название: localtime и undefined value
Отправлено: Phoinix от 02 Декабря 2005, 12:51:15
Error202

Во-первых, time считается не с 1900 года а 1970 года;
Во-вторых, объясни что ты тут делаешь?

$secy=((($y-1900)*365)-int($y/4))*24*60*60;

Если "выкусываешь" високосные года, то по математике у тебя явно была двойка...
И потом, а не стоит ли вернуть в последствие високосные года...

Дальше особо и не смотрел... исправь хотя бы это...

Добавлено:
В третьих, зачем тебе первый (нулевой) элемент массива месяцев, что бы потом цикл с единицы начинать?
Название: localtime и undefined value
Отправлено: Error202 от 02 Декабря 2005, 13:01:52
Ну да... Корявая формулка получилась... :)


$secy=((($y-1970)*365)-int(($y-1970)/4))*24*60*60;
 

Такая прокатит?

Только теперь в датах действительно разница 1 месяц, но не с 1-го по 30 (или 31), а с 15 по 15 :(
Название: localtime и undefined value
Отправлено: Error202 от 02 Декабря 2005, 13:14:24
Всем спасибо... Я извращенец... В моем случае вообще этого гемороя можно избежать...