2016-01-31 63 views
-1

我有一個例程來確定它是週末還是星期幾,但它無法在星期五正常工作。有問題的日期時間能夠計算除星期五之外的星期幾

我創建了一個測試程序,以瞭解爲什麼在7PM(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 
+0

感謝您的DateTime捕獲。我不明白在哪裏休息是與goto的其他。 – BrianB

+0

我已經結束了日常工作,不明白GOTO是如何造成問題的。有人可以幫助我解決這個問題嗎? – BrianB

回答

3

你展示的代碼沒有產生這種產出。例如,變量$date從未設置,您的輸出表示它等於在18:50的29-01-2016。後來,在19:04,它看起來像我期望的那樣空了。也沒有代碼,以產生出現在輸出的兩個樣本的結束It is now

的差異很可能是因爲你改變了你的代碼,而不是因爲行爲不端DateTime後,下午7:00

注意由localtime返回的週日值在週六有6個,週日爲0,而DateTime模塊的day_of_week方法在週六使用6,週日使用7。你真的應該堅持一個或另一個

如果你認爲你有一個真正的問題,再加入use strictuse warnings 'all',解決所出現的錯誤和之前與相同的代碼的運行起來後你的新方案,並晚上7點後。這將允許我們進一步幫助您

+0

對不起,如果從#my $ now = scalar localtime time()+ tz_offset($ TZ);我注意到了。不認爲我提供了編輯前一分鐘運行例程的結果。其他語句#print「現在是$ now \ n」; – BrianB

+0

感謝您的幫助>看起來我將不得不閱讀正確使用DateTime並清理(如您陳述的)使用其中一個或另一個,因爲它與localtime有關。 – BrianB

0

DateTime->now()DateTime->today()默認情況下使用UTC時間。 例如,如果您在美國東部標準時區,這意味着在星期一18:59:59它是週一23:59:59 UTC,但週一19:00:01 EST是星期二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; 

這會在您當前的版本中發現幾個錯誤。

相關問題