Почему Date :: Calc жалуется на "недопустимую дату"? - PullRequest
0 голосов
/ 20 февраля 2009

Раньше у меня эта функция работала ...

$this_day = Day_of_Week($lyear, $month, $day);

используя эту библиотеку ..

use Date::Calc qw(Add_Delta_Days Day_of_Week Delta_Days);

Но мне нужен другой способ получить ту же информацию.

ошибка, которую он возвратил,

Date::Calc::Day_of_Week(): not a valid date

Есть идеи?

Ответы [ 5 ]

4 голосов
/ 20 февраля 2009

В сообщении об ошибке говорится, что вы передаете Date :: Calc неверную дату. Не делай этого. Вы можете использовать функцию check_date для Date :: Calc, чтобы определить, является ли дата действительной.

use Date::Calc qw(Add_Delta_Days check_date Day_of_Week Delta_Days);

$this_day = (check_date($lyear, $month, $day)
             ? Day_of_Week($lyear, $month, $day)
             : 'INVALID');

Исправить недействительные даты сложнее, потому что это зависит от того, как вы получаете недопустимые даты и что вы хотите с ними сделать. Например, если день может быть вне диапазона, и вы хотите исправить 31 апреля - 1 мая, вы можете использовать

($lyear, $month, $day) = Add_Delta_Days($lyear, $month, 1,  $day-1);

Но это не исправит неверный год или месяц.

2 голосов
/ 20 февраля 2009

Это немного барокко, но мне всегда нравился Date :: Manip.

Я не думаю, что вам нужна альтернативная методология. Скорее всего, вам нужно прекратить кормление Date :: Calc неверные даты.

На каких значениях происходит ошибка?

2 голосов
/ 20 февраля 2009
use Posix qw(mktime);
my $epoch = mktime(sec, min, hour, mday, mon, year);
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($epoch);
1 голос
/ 20 февраля 2009

В качестве альтернативы ответу heeen-а, вы можете использовать strftime:

use Posix qw(strftime);
my $wday = strftime('%w', sec, min, hour, mday, mon, year); # 0 = Sunday, 1 = Monday, etc...
my $day_name = strftime('%a', sec, min, hour, mday, mon, year); # Sun, Mon, etc...
my $day_name_long = strftime('%A', sec, min, hour, mday, mon, year); # Sunday, Monday, etc...
1 голос
/ 20 февраля 2009

Вы можете использовать Дата :: Простой .

use Date::Simple (':all');
my $date = ymd($year, $month, $day);
my $dow = $date->day_of_week();
...