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

时间:2018-08-22 00:43:56

标签: 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 ) );

printf“日期:%s周:%s \ n”,$ date,$ week;

=>日期:1899年12月31日星期:53

但是,当$ date = '12 / 30/1900'时,它将返回第52周而不是第53周。

您能帮我指出问题吗?谢谢。

1 个答案:

答案 0 :(得分:6)

  

%U

     

当年的星期数,以十进制数表示,范围为00到53,从第一个星期日作为第01周的第一天开始。另请参见%V%W

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

您可以使用calendar of 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年。

这说明了为什么您为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 )