【问题标题】:Convert Unix timestamp to a readable date in Perl将 Unix 时间戳转换为 Perl 中的可读日期
【发布时间】:2013-02-25 10:06:02
【问题描述】:

我有一些 Unix 时间戳(例如,1357810480,所以它们主要是过去的)。如何使用 Perl 将它们转换为可读的日期格式?

【问题讨论】:

    标签: perl timestamp


    【解决方案1】:

    快速shell单线:

    perl -le 'print scalar localtime 1357810480;'
    Thu Jan 10 10:34:40 2013
    

    或者,如果您碰巧在文件中有时间戳,则每行一个:

    perl -lne 'print scalar localtime $_;' <timestamps
    

    【讨论】:

      【解决方案2】:

      Time::Piece 的完美使用(Perl 自 5.10 起的标准)。

      use 5.010;
      use Time::Piece;
      
      my $unix_timestamp = 1e9; # for example;
      
      my $date = localtime($unix_timestamp)->strftime('%F %T'); # adjust format to taste
      
      say $date; # 2001-09-09 02:46:40
      

      【讨论】:

      • '%f %T' 对我不起作用(可能是因为我的语言环境),但 '%Y-%m-%d' 确实起作用。
      • Time::Piece 对时区的奇怪而错误的处理让我发誓。它可用于将时间戳转换为字符串,但尝试从 Time::Piece 对象中提取时间戳会产生意外且不可靠的结果。它会更改时间戳以匹配机器的时区,实际上是从中添加或减去秒数,从而导致时间戳不准确。当您稍后检索您的时间戳时,您会发现它是 x 小时。
      • felwithe 可能使用了Time::Piece-&gt;new(...) 而不是localtime(...)
      【解决方案3】:

      你可以使用

      my ($S, $M, $H, $d, $m, $Y) = localtime($time);
      $m += 1;
      $Y += 1900;
      my $dt = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $Y, $m, $d, $H, $M, $S);
      

      但使用strftime 会更简单一些:

      use POSIX qw( strftime );
      my $dt = strftime("%Y-%m-%d %H:%M:%S", localtime($time));
      

      localtime($time) 可以替换为gmtime($time) 如果更合适的话。

      【讨论】:

        【解决方案4】:

        您可以为此使用localtime

        my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($unix_timestamp);
        

        【讨论】:

        • 是的,这会将数组放入$time。在那之后,例如$time[2]
        • 谢谢,但我想将格式化的日期直接存储在一个变量中。你认为这有什么可能吗?我当前的解决方案似乎保存了当前日期,无论给定时间戳有多旧
        • 一种方法是$formatted_time = scalar(localtime($unix_timestamp)),或者使用Date::Format$formatted_time = time2str("%D", $unix_timestamp);
        • @hurley,它返回给定时间戳的数据,而不是“当前日期”。
        【解决方案5】:

        或者,如果您有一个嵌入时间戳的文件,您可以使用以下方法将它们转换到位:

        $ cat [file] | perl -pe 's/([\d]{10})/localtime $1/eg;'
        

        【讨论】:

        • 这正是我所需要的!我可以将我的日志文件通过管道传输到 perl 单行和 BINGO 即时日期/时间。
        【解决方案6】:

        我喜欢 JDawg 的回答,但无法让它在我正在使用的 RHEL 系统上正常工作。我能够让它工作。希望这会对某人有所帮助。它显示带有转换后时间戳的文件内容。

        cat filename | perl -pe 's/(\d+)/localtime($1)/e'

        【讨论】:

          【解决方案7】:

          添加到答案中,您还可以将 localtime 替换为 gmtime 以获得 UTC 时间。我发现这在我的 bash 脚本中非常有用:

          世界标准时间:

          echo 1357810480  | perl -nE 'say scalar gmtime $_'
          

          本地:

          echo 1357810480  | perl -nE 'say scalar localtime $_'
          

          *如果您不需要在输出末尾换行,您可以将say 替换为print

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-21
            • 1970-01-01
            • 2020-10-19
            • 2020-12-23
            • 2016-04-24
            • 2012-07-04
            相关资源
            最近更新 更多