是否有perl 5.005核心模块可以将纪元秒转换为日期时间字符串?

时间:2011-11-09 14:44:46

标签: perl datetime epoch

5.005中是否存在将epoch秒转换为可打印日期时间的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模块集中)

3 个答案:

答案 0 :(得分:11)

根据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

答案 1 :(得分:5)

查看核心例程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

答案 2 :(得分:0)

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

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