为什么Date :: Calc会抱怨“不是一个有效的日期”?

时间:2009-02-20 19:07:09

标签: perl date date-manipulation

以前,这个功能对我有用......

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

使用这个lib ..

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

但我需要另一种方法来获得相同的信息。

它返回的错误是

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

有什么想法吗?

5 个答案:

答案 0 :(得分:4)

错误消息显示您正在传递Date :: Calc无效日期。不要那样做。您可以使用Date :: Calc的check_date函数来确定日期是否有效。

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');

更正无效日期更为复杂,因为它取决于您获取无效日期的方式以及您想要对其进行的操作。例如,如果日期可能超出范围,并且您想要在4月31日到5月1日之间进行更正,则可以使用

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

但这不会纠正无效的年份或月份。

答案 1 :(得分:2)

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);

答案 2 :(得分:2)

这是一个小巴洛克式,但我总是喜欢Date :: Manip。

我认为不需要替代方法。更有可能的是,您需要停止提供Date :: Calc无效日期。

它出现了什么价值?

答案 3 :(得分:1)

您可以使用Date::Simple

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

答案 4 :(得分:1)

作为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...