0

以前,此功能对我有用...

$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

有任何想法吗?

4

5 回答 5

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

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

于 2009-02-20T19:41:26.597 回答
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);
于 2009-02-20T19:10:04.223 回答
2

它有点巴洛克风格,但我一直很喜欢 Date::Manip。

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

它在什么值上出错?

于 2009-02-20T19:10:13.490 回答
1

您可以使用Date::Simple

use Date::Simple (':all');
my $date = ymd($year, $month, $day);
my $dow = $date->day_of_week();
于 2009-02-20T19:13:42.497 回答
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...
于 2009-02-20T19:26:19.097 回答