Ошибка локального времени Perl - PullRequest
1 голос
/ 02 марта 2012

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

Следующий код:

#!/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;
}

Ответы [ 2 ]

5 голосов
/ 02 марта 2012

Вы начинаете с 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/.

2 голосов
/ 02 марта 2012

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

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

...