【问题标题】:Is there a perl 5.005 core module that would convert epoch seconds to a datetime string?是否有 perl 5.005 核心模块可以将纪元秒数转换为日期时间字符串?
【发布时间】:2011-12-25 09:13:30
【问题描述】:

5.005 中是否有一个 perl 核心模块可以将纪元秒转换为可打印的日期时间?

我们的系统有 DateTime.pm,但需要该功能的脚本仍在 Perl 5.005 上,无法将其升级到 5.6+(不要问。只是因为非技术原因无法完成)。 DateTime.pm - 至少我们拥有的版本 - 需要 5.6。

因此我需要以下之一:

  • 理想情况下,Perl 5.005 内核中的模块可以将纪元秒数转换为日期/时间字符串。最好是 YY/MM/DD hh:mm:ss 格式,但不是必需的。

  • 如果做不到这一点,一个 5.005 兼容的非 XS 模块会将纪元秒转换为日期/时间字符串。最好是 YY/MM/DD hh:mm:ss 格式,但不是必需的。

    强烈偏好在 Perl 5.005 发布时在 CPAN 上具有此功能的模块(这样看来,它可能会出现在公司现有的一组 CPAN 模块中)

【问题讨论】:

标签: perl datetime epoch


【解决方案1】:

根据CPANPOSIX 模块可用。所以你可以使用strftime 函数。这是我在 5.8.8 中一直使用的

use POSIX();
my $time_t = 1234567890;
my $txt = POSIX::strftime( "%Y-%m-%d %T", localtime($time_t) );
print "$txt\n";

给予

2009-02-14 10:31:30

【讨论】:

    【解决方案2】:

    请参阅核心例程 localtimegmtime(另见 time)。

    恕我直言,编写一个小子程序来进行这种格式化通常比引入新的依赖项更容易。例如:

    sub epoch_to_datetime {
      my $time = shift(@_) || time();
      my ($s, $m, $h, $md, $mo, $yr) = localtime($time);
      my $date = join("/",
          sprintf("%02d", $yr % 100),
          sprintf("%02d", $mo + 1),
          sprintf("%02d", $md));
      my $time = join(":",
          sprintf("%02d", $h),
          sprintf("%02d", $m),
          sprintf("%02d", $s));
      return "$date $time";
    }
    
    print epoch_to_datetime(time()) . "\n";
    # 11/11/09 08:06:10
    

    【讨论】:

      【解决方案3】:

      POSIX::strftime 解决方案是最灵活的解决方案。但是,如果您对确切的格式不是很挑剔,那么您可以在标量上下文中使用localtime(或gmtime)从纪元秒中获取人类可读的日期时间字符串。

      $ perl -le'print scalar localtime 1000000000'
      Sun Sep  9 02:46:40 2001
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-03
        • 2018-02-18
        • 2012-11-22
        • 2014-11-18
        • 2017-11-10
        • 1970-01-01
        • 2012-06-14
        • 2011-07-11
        相关资源
        最近更新 更多