有问题的DateTime能够计算除星期五之外的星期几

时间:2016-01-31 00:23:57

标签: perl datetime

我有一个例程来确定它是周末还是工作日,但它在周五无法正常工作。

我创建了一个测试程序,以便了解为什么在晚上7点(19:00:00)之前,例行程序将当天视为工作日和晚上7点,之后将当天视为周末。

#!/usr/bin/perl
use DateTime;

MONTHCHECK:
my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset,
    $dayOfWeek, $dayOfYear, $daylightSavings) = localtime();

my @abbr = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dcm);
my $mnth = $abbr[$month];       


WEEKENDCHECK:
if ( DateTime->today->day_of_week >= 6 && day_of_week <= 7 ) {    
    print "$dayOfWeek is today \n";
    goto HOLIDAY;
} else {
    print "going to weekday";
    goto WEEKDAY;
}

WEEKDAY:
print "weekday section month is  $mnth \n";
goto END;

HOLIDAY:
my $h = "h";
my $mth = join "", $mnth, $h;
print "holiday section month is  $mth \n";
goto END;


END:
print "$date is the day and $hour hr \n";   
print "$date is the day \n";    
exit(0);

在18:50:00之前,我得到了正确的结果:

going to weekday5 is today 
weekday section month is  Jan 
29-01-2016 is the day and 18 hr 
It is now Fri Jan 29 18:50:02 2016

19:00:00后,我得到以下结果:

5 is today 
holiday section month is  Janh 
is the day and 19 hr 
It is now Fri Jan 29 19:04:21 2016

2 个答案:

答案 0 :(得分:3)

您显示的代码没有产生该输出。例如,变量$date从未设置,但输出表明它在18:50时等于29-01-2016。后来,在19:04,它似乎是空的,正如我所料。也没有代码可以生成出现在两个输出样本末尾的It is now

差异很可能是因为您更改了代码,而不是因为DateTime在晚上7点后行为不端

请注意,localtime返回的工作日值周六为6,周日为0,而DateTime模块的day_of_week方法周六使用6,周日使用7 。你应该坚持一个或另一个

如果您认为自己有真正的问题,请添加use strictuse warnings 'all',修复出现的错误并将新程序与相同代码的运行一起发布晚上7点之前和之后。这将使我们能够进一步帮助您

答案 1 :(得分:0)

默认情况下,

DateTime->now()DateTime->today()使用UTC时间。 例如,如果你是美国东部标准时区,这意味着周一美国东部时间18:59:59周一它是星期一23:59:59 UTC,但是周一美国东部时间19:00:01它&# 39;星期二00:00:01 UTC。

要获取当地的某一天,请将时区名称(例如America/Denver)或local作为time_zone参数传递:

my $today1 = DateTime->today(time_zone=>'America/New_York');
my $today2 = DateTime->today(time_zone=>'local');

另外,正如其他人所说,你真的应该用

开始你的脚本
use strict;
use warnings;

这会在您当前的版本中找到几个错误。