使用POSIX :: strftime与localtime +一些自定义格式在perl

时间:2016-09-22 17:55:43

标签: perl

我正在尝试以“YYYY-MM-DD HH:MM:SS”格式生成基于perl中系统时间的时间戳,并且当前正在使用POSIX模块执行此操作:

require POSIX;
$timestamp = POSIX::strftime('%F %T', localtime);

有一个替代方案,它更原始:

my ($s,$min,$h,$d,$m,$y) = (localtime)[0..5];
$y += 1900;
$m   = sprintf('%.2d', ++$m);
$d   = sprintf('%.2d', $d);
$h   = sprintf('%.2d', $h);
$min = sprintf('%.2d', $min);
$s   = sprintf('%.2d', $s);
$timestamp = "$y-$m-$d $h:$min:$s";

我只需要以上述格式生成时间戳,但无法决定使用哪种方法。此代码预计将在多个平台(包括Linux)上以相当高的频率运行。我正在考虑使用$ ^ O来评估操作系统名称,并将前者用于Linux,将后者用于其他所有操作。

每个的好处/缺点是什么(显然除了更多代码行之外)。如果有更多知识渊博的人能指出我正确的方向,我将不胜感激。我搜索了互联网和perldocs,但找不到答案。如果有人可以直接回答这个问题或者指向一个可以帮助我解决此问题的资源(网站/博客/书籍),那将会非常有帮助。

非常感谢提前。

2 个答案:

答案 0 :(得分:5)

如果我们清理您的代码段并使其可移植(避免%F%T),我们就会

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

my ($sec, $min, $hour, $day, $month, $year) = localtime;
my $timestamp = sprintf("%d-%02d-%02d %02d:%02d:%02d",
   $year+1900, $month+1, $day, $hour, $min, $sec);

我会使用前者,因为它更简单。无论操作系统如何,都是如此。

答案 1 :(得分:3)

这是一种替代解决方案,它使用与解决方案ikegami explained相同的基础C库。我没有做任何基准测试,看看哪一个更快或更有效。

您可以 使用Time::Piece,自Perl 5.10以来一直处于核心状态。它使用方便的方法将localtime的返回值升级为对象。您可以直接在返回值上使用它们,而无需将其分配给变量。

use Time::Piece;
my $timestamp = localtime->strftime('%Y-%m-%d %H:%M:%S');
   # Neither %F nor %T work on Windows.