【问题标题】:How can I format a timestamp in Perl?如何在 Perl 中格式化时间戳?
【发布时间】:2011-01-10 02:37:01
【问题描述】:

我想得到这个时间戳格式:

01/13/2010 20:42:03 - -

数字总是 2 位数字,但年份除外,它是 4 位数字。它基于 24 小时制。

如何在 Perl 中做到这一点?我更喜欢原生函数。

【问题讨论】:

  • 虽然我理解您对本机/核心模块的偏好,但 DateTime 和一些相关的格式化程序绝对值得您投入使用。 search.cpan.org/dist/DateTime

标签: perl time format timestamp clock


【解决方案1】:

POSIX 提供strftime

$ perl -MPOSIX -we 'print POSIX::strftime("%m/%d/%Y %H:%M:%S\n", localtime)' 2010 年 1 月 27 日 14:02:34

你可能会想写这样的东西:

my ($sec, $min, $hr, $day, $mon, $year) = localtime;
printf("%02d/%02d/%04d %02d:%02d:%02d\n", 
       $day, $mon + 1, 1900 + $year, $hr, $min, $sec);

作为避免POSIX 的一种方式。别! AFAIK,POSIX.pm 自 1996 年或 1997 年以来一直处于核心地位。

【讨论】:

  • 从问题中明确的01/13/2010来看,Brian似乎想要"%m/%d/...甚至"%D %T"的格式。
  • @gbacon %D %T 在 Windows 上的 perl 5.10.1 上不起作用(在 Linux 上确实如此),我决定谨慎行事。感谢您注意到我不小心交换了%m%d
  • 但也不要避免了解localtime(或sprintf)。
  • 虽然使用 POSIX 很酷,而且是正确的,但我在某处读到该模块非常消耗资源。所以我猜你可能想在某些情况下牺牲它......
【解决方案2】:

尝试使用 CPAN 中的 Date::Format 格式化子例程。

【讨论】:

    【解决方案3】:

    这是我使用的子程序。它允许您以您喜欢的任何格式获取日期时间戳。

    #! /usr/bin/perl
    use strict;
    use warnings;
    
    use POSIX;
    use POSIX qw(strftime);
    
    sub getTime 
    {
        my $format = $_[0] || '%Y%m%d %I:%M:%S %p'; #default format: 20160801 10:48:03 AM
        my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(time);
        return strftime($format, $sec, $min, $hour, $wday, $mon, $year, $mday);
    }
    
    # Usage examples
    print getTime()."\n";                    #20160801 10:48:03 AM
    print getTime('%I:%M:%S %p')."\n";       #10:48:03 AM
    print getTime('%A, %B %d, %Y')."\n";     #Monday, August 01, 2016
    print getTime('%Y%m%d %H:%M:%S')."\n";   #20160801 10:48:03
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 2019-02-17
      • 2012-06-24
      相关资源
      最近更新 更多