Ошибка локального времени Perl

Я получаю время эпохи 28го февраля 2009 года, а затем добавляю к нему количество секунд в неделе. Но тогда я получаю 4th марта вместо 7th марта. Почему?

Ниже приведен код:

#!/usr/bin/perl
use POSIX;

my $hours_per_day    =   24;
my $hours_per_week   =  168;
my $seconds_per_hour = 3600;
my $seconds_per_week = ($hours_per_week * $seconds_per_hour);

#begin at my first week
$epoch_seconds = POSIX::mktime(0,0,12,28,2,109);

for(my $cline = 1; $cline <= 250; $cline++) {
    ($sec,$min,$hour,$mday,$month,
     $year,$wday,$yday,$isdst) = localtime($epoch_seconds);

    $year += 1900;
    print STDOUT "$cline <=> $year/$month/$mday\n";

    $epoch_seconds += $seconds_per_week;
}

person john-jones    schedule 02.03.2012    source источник
comment
Как можно иметь золотой значок, но не уметь пользоваться форматированием кода разметки?   -  person TLP    schedule 02.03.2012
comment
@TLP, вот что я хочу знать. ›.‹   -  person Qtax    schedule 02.03.2012
comment
четыре пробела = это код. Я думаю, что я делаю сейчас.   -  person john-jones    schedule 02.03.2012
comment
@HermannIngjaldsson Вы также можете нажать кнопку формата кода или нажать CTRL-K.   -  person TLP    schedule 02.03.2012
comment
@TLP Это просто золотой значок Fanatic, доказывающий упорство, а не опыт. Если вы оставите окно браузера открытым для StackOverflow с ежедневным обновлением, вы получите его через 100 дней, несмотря ни на что.   -  person tchrist    schedule 03.03.2012


Ответы (2)


Вы начинаете с 28 марта 2009 г., а через неделю – 4 апреля 2009 г.

use POSIX;

my $hours_per_day=24;
my $hours_per_week=168;
my $seconds_per_hour=3600;
my $seconds_per_week=($hours_per_week*$seconds_per_hour);

#begin at my first week
my $epoch_seconds=POSIX::mktime(0,0,12,28,2,109);

for(my $cline=1; $cline<=250; $cline++) {
    my ($sec,$min,$hour,$mday,$month,
     $year,$wday,$yday,$isdst) =localtime($epoch_seconds);

    print strftime( "%A, %B %e, %Y\t", localtime($epoch_seconds) );
    $year+=1900;
    print STDOUT "$cline <=> $year/$month/$mday\n";

    $epoch_seconds+=$seconds_per_week;
}

PS: вам действительно следует использовать strftime для форматирования дат. См. perldoc POSIX и найдите /strftime/.

person shawnhcorey    schedule 02.03.2012
comment
о черт.. 2 марта.. конечно! Я просто автоматически предположил, что 2 февраля. - person john-jones; 04.03.2012

Не каждая неделя длится ровно $seconds_per_week (високосные годы и т. д.), вы должны использовать функцию/библиотеку/модуль, который выполняет вычисления за вас.

Как описано здесь или здесь. Удачи!

person Wesley    schedule 02.03.2012
comment
Я пробовал, возникли проблемы с установкой модуля. Cpan — не лучший пользовательский интерфейс, который я когда-либо видел. - person john-jones; 02.03.2012
comment
Герман Ингьялдссон, расплывчатый комментарий расплывчатый. CPAN — это источник жизненной силы Perl, поэтому мы скорее поможем вам установить наиболее подходящее программное обеспечение. Откройте новый вопрос, чтобы описать проблему. - Напишите, какой именно аспект пользовательского интерфейса вы считаете плохим, без критики нет улучшения. - person daxim; 02.03.2012
comment
@HermannIngjaldsson cpan DateTime -- не так уж и сложно. Обратите внимание, что для выполнения вам потребуются правильные привилегии, поэтому, в зависимости от вашей системы, вам может потребоваться sudo/su. При этом я всегда предпочитаю использовать apt-get сам. sudo apt-get install libdatetime-perl. - person TLP; 02.03.2012
comment
Решение, которое я придумал, — это решение без CPAN, и, следовательно, оно лучше. Я отправлю вопрос, когда придет время, спасибо за помощь. - person john-jones; 02.03.2012
comment
Наличие 2, представляющих февраль, на самом деле было бы лучшим пользовательским интерфейсом, который лучше соответствует человеческому мышлению. - person john-jones; 02.03.2012
comment
Вы были бы правы только в том случае, если бы процедуры даты и времени POSIX и дистрибутив DateTime имели одинаковое качество. Это не тот случай. DateTime намного лучше (месяцы начинают отсчет с 1 по умолчанию, поэтому вы не споткнетесь об ошибке, которую вы сделали с POSIX из-за глупой структуры времени C) и на самом деле правильно моделирует время (имеет часовые пояса, микросекунды и дополнительные секунды). - person daxim; 02.03.2012
comment
Хорошо, так что в следующий раз, когда возникнет необходимость, я разберусь с этим cpan. - person john-jones; 02.03.2012
comment
Как високосный год меняет количество секунд в неделе? - person tchrist; 03.03.2012