获得一年中的一周(一周的第一天是星期日)无法返回第53周

hhy*_*hhy 1 perl posix

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周.

你能帮我指出一下这个问题吗?谢谢.

ike*_*ami 6

%U

当前年份的周数作为十进制数,范围为00到53,从第一个星期日开始,作为第01周的第一天.参见%V%W.

根据该定义,1900-12-30是第52周的一部分.

您可以使用1900年日历自行验证.

  • 1900年第0周:1900年1月1日星期一至1900年1月6日星期六
  • 1900年第1周:1900年1月7日星期日至1900年1月13日星期六
  • ...
  • 1900年第51周:太阳,1900年12月23日至1900年12月29日星期六
  • 1900年第52周:太阳,1900年12月30日至1900年12月31日星期一

也就是说,你得到正确的答案是侥幸(52).你传递0($year - 1900)作为最后一个参数timelocal,它指的是2000年,而不是1900年.

这就解释了为什么你都拿到5312/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)