首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >perl 5.28.x编译:失败的测试‘1970年代的时间年’

perl 5.28.x编译:失败的测试‘1970年代的时间年’
EN

Stack Overflow用户
提问于 2022-02-14 15:46:19
回答 1查看 323关注 0票数 2

在Linux中,在运行本地模块的make测试命令时,perl的安装失败

代码语言:javascript
运行
复制
[user@hostname perl-5.28.3]$  make test
cpan/Time-Local/t/Local ........................................ #   Failed test 'timelocal year for 1970 1 2 0 0 0'
#   at t/Local.t line 109.
#          got: '170'
#     expected: '70'
#   Failed test 'timegm year for 1970 1 2 0 0 0'
#   at t/Local.t line 124.
#          got: '170'
#     expected: '70'
# Looks like you failed 2 tests of 187.
FAILED at test 6

系统日期在我的系统中被正确设置。

代码语言:javascript
运行
复制
[user@hostname perl-5.28.3]$ date
Mon Feb 14 07:38:07 PST 2022

是否存在针对此问题的perl-5.28.x版本的解决方案/修补程序?

测试失败:

代码语言:javascript
运行
复制
[user@hostname perl-5.28.3]$ t/TEST ../cpan/Time-Local/t/Local.t
t/../cpan/Time-Local/t/Local ... #   Failed test 'timelocal year for 1970 1 2 0 0 0'
#   at t/Local.t line 109.
#          got: '170'
#     expected: '70'
#   Failed test 'timegm year for 1970 1 2 0 0 0'
#   at t/Local.t line 124.
#          got: '170'
#     expected: '70'
# Looks like you failed 2 tests of 187.
FAILED at test 6
Failed 1 test out of 0, 0.00% okay.
        ../cpan/Time-Local/t/Local.t

任何指针都将受到高度赞赏。

EN

Stack Overflow用户

回答已采纳

发布于 2022-02-14 16:43:19

这仅仅是一个写得不好的测试,可以安全地忽略。

测试是在较新版本的Time::Local中修正的,而不是与perl-5.28.3捆绑的版本。之后,您可以使用cpan Time::Local安装该版本。

如果坚持进行干净安装,可以运行以下命令:

代码语言:javascript
运行
复制
patchperl 5.28.3 /path/to/untarred/perl/source/perl-5.28.3

它需要安装了Devel::PatchPerl的Perl。它安装以下修补程序:

代码语言:javascript
运行
复制
--- cpan/Time-Local/t/Local.t
+++ cpan/Time-Local/t/Local.t
@@ -85,19 +85,17 @@ my $epoch_is_64

 for ( @time, @neg_time ) {
     my ( $year, $mon, $mday, $hour, $min, $sec ) = @$_;
-    $year -= 1900;
     $mon--;

 SKIP: {
         skip '1970 test on VOS fails.', 12
-            if $^O eq 'vos' && $year == 70;
+            if $^O eq 'vos' && $year == 1970;
         skip 'this platform does not support negative epochs.', 12
-            if $year < 70 && !$neg_epoch_ok;
+            if $year < 1970 && !$neg_epoch_ok;

         # Test timelocal()
         {
-            my $year_in = $year < 70 ? $year + 1900 : $year;
-            my $time = timelocal( $sec, $min, $hour, $mday, $mon, $year_in );
+            my $time = timelocal( $sec, $min, $hour, $mday, $mon, $year );

             my ( $s, $m, $h, $D, $M, $Y ) = localtime($time);

@@ -106,13 +104,12 @@ SKIP: {
             is( $h, $hour,     "timelocal hour for @$_" );
             is( $D, $mday,     "timelocal day for @$_" );
             is( $M, $mon,      "timelocal month for @$_" );
-            is( $Y, $year,     "timelocal year for @$_" );
+            is( $Y, $year - 1900,     "timelocal year for @$_" );
         }

         # Test timegm()
         {
-            my $year_in = $year < 70 ? $year + 1900 : $year;
-            my $time = timegm( $sec, $min, $hour, $mday, $mon, $year_in );
+            my $time = timegm( $sec, $min, $hour, $mday, $mon, $year );

             my ( $s, $m, $h, $D, $M, $Y ) = gmtime($time);

@@ -121,14 +118,13 @@ SKIP: {
             is( $h, $hour,     "timegm hour for @$_" );
             is( $D, $mday,     "timegm day for @$_" );
             is( $M, $mon,      "timegm month for @$_" );
-            is( $Y, $year,     "timegm year for @$_" );
+            is( $Y, $year - 1900,     "timegm year for @$_" );
         }
     }
 }

 for (@bad_time) {
     my ( $year, $mon, $mday, $hour, $min, $sec ) = @$_;
-    $year -= 1900;
     $mon--;

     eval { timegm( $sec, $min, $hour, $mday, $mon, $year ) };
@@ -229,6 +225,30 @@ SKIP:
     );
 }

+# 2-digit years
+{
+       my $current_year = ( localtime() )[5];
+       my $pre_break    = ( $current_year + 49 ) - 100;
+       my $break        = ( $current_year + 50 ) - 100;
+       my $post_break   = ( $current_year + 51 ) - 100;
+
+       is(
+               ( ( localtime( timelocal( 0, 0, 0, 1, 1, $pre_break ) ) )[5] ),
+               $pre_break + 100,
+               "year $pre_break is treated as next century",
+       );
+       is(
+               ( ( localtime( timelocal( 0, 0, 0, 1, 1, $break ) ) )[5] ),
+               $break + 100,
+               "year $break is treated as next century",
+       );
+       is(
+               ( ( localtime( timelocal( 0, 0, 0, 1, 1, $post_break ) ) )[5] ),
+               $post_break,
+               "year $post_break is treated as current century",
+       );
+}
+
 SKIP:
 {
     skip 'These tests only run for the package maintainer.', 8
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71114526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档