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

Posted

技术标签:

【中文标题】是否有 perl 5.005 核心模块可以将纪元秒数转换为日期时间字符串?【英文标题】:Is there a perl 5.005 core module that would convert epoch seconds to a datetime string? 【发布时间】: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 模块中)

【问题讨论】:

“不要问。只是因为非技术原因无法完成”废话! search.cpan.org/~gugod/App-perlbrew-0.33/lib/App/perlbrew.pm @Jack - “非技术”的哪一部分适用于您提出的技术解决方案?一些开发人员存在于大型企业环境中,这些东西称为“策略”。 【参考方案1】:

根据CPAN,POSIX 模块可用。所以你可以使用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

【讨论】:

以上是关于是否有 perl 5.005 核心模块可以将纪元秒数转换为日期时间字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Perl 将纪元时间转换为 UTC 时间?

将记录的日期时间转换为 UNIX 纪元时间戳的 Perl 脚本

Perl 将本地时间转换为 unix(纪元)时间

如何在 Perl 中将 dd/mm/yyyy 转换为纪元时间?

如何从 Perl 中的随机纪元时间戳获取纪元形式的月份开始?

将mysql DATETIME列转换为纪元秒