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 ) );
printf“日期:%s周:%s \ n”,$ date,$ week;
=>日期:1899年12月31日星期:53
但是,当$ date = '12 / 30/1900'时,它将返回第52周而不是第53周。
您能帮我指出问题吗?谢谢。
答案 0 :(得分:6)
%U
当年的星期数,以十进制数表示,范围为00到53,从第一个星期日作为第01周的第一天开始。另请参见
%V
和%W
。
根据该定义,1900-12-30是第52周的一部分。
您可以使用calendar of 1900自己进行验证。
也就是说,您得到了正确答案(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 )
使用
timelocal( 0, 0, 0, $day, $month - 1, $year )