use strict;
use Time::Local;
use POSIX qw(strftime);
my $date = '12/31/1899';
my ($month, $day, $year) = split '/', $date;
my $epoch = timelocal( 0, 0, 0, $day, $month - 1, $year - 1900 );
my $week = strftime( "%U", localtime( $epoch ) );
Run Code Online (Sandbox Code Playgroud)
printf"日期:%s周:%s \n",$ date,$ week;
=>日期:12/31/1899周:53
但是当$ date = '12/30/1900'时,它返回第52周而不是第53周.
你能帮我指出一下这个问题吗?谢谢.
%U当前年份的周数作为十进制数,范围为00到53,从第一个星期日开始,作为第01周的第一天.参见
%V和%W.
根据该定义,1900-12-30是第52周的一部分.
也就是说,你得到正确的答案是侥幸(52).你传递0($year - 1900)作为最后一个参数timelocal,它指的是2000年,而不是1900年.
这就解释了为什么你都拿到53了12/31/1900.1900-12-31在第52周,而2000-12-31在第53周开始.
要解决这个问题,请更换
timelocal( 0, 0, 0, $day, $month - 1, $year - 1900 )
Run Code Online (Sandbox Code Playgroud)
同
timelocal( 0, 0, 0, $day, $month - 1, $year )
Run Code Online (Sandbox Code Playgroud)