【问题标题】:Perl time Vs Unix date output inconsistencyPerl 时间与 Unix 日期输出不一致
【发布时间】:2014-10-29 14:30:58
【问题描述】:

我是 perl 的初学者,正在尝试我的第一个 perl 脚本来将 epoch-sconds 中的时间信息转换为特定格式。我从其他 stackoverflow 问题中了解到 perl 中的 Jan = 0 月和 1900 = 0 年。即使对它们进行了调整,我也没有看到 unix 和 perl 之间的输出相同。

这是我尝试并得到的。

Unix:

日期 -d @915149280

给我:

1998 年 12 月 31 日星期四 19:08:00 EST

Perl:

$time = 915149280;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime($time);
$year = $year + 1900;
$mon = $mon + 1;
print "Formated time = $mday/$mon/$year $hour:$min:$sec $weekday[$wday]\n";

给我:

格式化时间 = 1/1/1999 0:8:0 Fri

perl 行有什么错误吗?我应该怎么做才能获得与 date 命令相同的输出? (不是格式化部分,而是时间)

我不是在寻找所有领域,只有年份对我来说很重要。

【问题讨论】:

  • 时区。你正好赶上 5 个小时。任何时候你得到一个确切的小时数不同的时差,这几乎是 99.999999% 的时区问题
  • 除时区差异外,大部分字段应使用printf"%02d"打印。
  • @KeithThompson:不,他/她应该使用 POSIX::strftime(或其他模块的 strftime)来打印所有字段 :)

标签: perl unix unix-timestamp


【解决方案1】:

我假设您谈论的是时间差异而不是格式差异,因为您的 Perl 代码甚至不会尝试复制该格式。

使用localtime 代替gmtimedate 命令默认使用您的本地时间。请注意,它显示的是“EST”,但 gmtime 返回 UTC,时差 5 小时。

您还应该考虑使用模块来处理日期格式。但这不会阻止当地时间和 UTC 之间的混淆。

【讨论】:

  • 是的,我说的是时差。顺便说一句,非常感谢您的解释。使用本地时间解决了我的问题。正如我所说,这是我的第一个 perl 脚本,甚至可能是最后一个。
【解决方案2】:

Time::Piece 已经包含在 Perl 中将近七年了,它将使您的时间和日期代码变得更加容易。

use Time::Piece;

my $then = gmtime(915149280);
print $then->strftime('%d-%m-%Y %H:%M:%S %a'); # produces 01-01-1999 00:08:00 Fri

【讨论】:

    【解决方案3】:

    您可以通过使用来自POSIX 模块的strftime 来大大简化此操作。

    perl -MPOSIX=strftime -le 'print strftime "%a %b %d %T %Y",localtime(915149280)'
    

    1998 年 12 月 31 日星期四 16:08:00

    POSIX 模块自 1994 年以来一直是 core 模块。通过使用显式导入列表,您可以避免加载大约 500 多个不需要的符号。

    【讨论】:

      猜你喜欢
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 2011-02-26
      • 2021-03-31
      • 2022-06-14
      • 2018-01-02
      • 2014-05-06
      相关资源
      最近更新 更多