19

我需要以格式获取时间,"20130808 12:12:12.123""yyyymmdd hour:min:sec.msec".

我试过了

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); 
$year += 1900;
$mon++;
if ($mon<10){$mon="0$mon"} 
if ($mday<10){$mday="0$mday"} 
if ($hour<10){$hour="0$hour"} 
if ($min<10){$min="0$min"} 
if ($sec<10){$sec="0$sec"}  but this doesn't provide the `msec` as a part of time.

我怎样才能做到这一点 ?

4

2 回答 2

33

这是一个完整的脚本。如前所述,它Time::HiRes::time用于微秒支持,也POSIX::strftime用于更轻松的格式化。不幸的是strftime无法处理微秒,因此必须手动添加。

use Time::HiRes qw(time);
use POSIX qw(strftime);

my $t = time;
my $date = strftime "%Y%m%d %H:%M:%S", localtime $t;
$date .= sprintf ".%03d", ($t-int($t))*1000; # without rounding

print $date, "\n";

如果您不介意使用 CPAN 模块,那么我建议您使用出色的 Time::Moment 模块:

use Time::Moment;
print Time::Moment->now->strftime("%Y%m%d %T%3f"), "\n";

如果它可以被格式化为 ISO8601 日期,包括时区偏移和微秒而不是毫秒,那么它很简单:

print Time::Moment->now->to_string, "\n";
于 2013-08-07T10:53:56.107 回答
11

使用时间::HiRes

简要地看一下,它可以很容易地提供自纪元以来的毫秒数,但似乎没有扩展 localtime(),因此在完整的日历上下文中使用它可能需要做一些工作。

这是一个工作示例:

use strict;
use warnings;

use Time::Format qw/%time/;
use Time::HiRes qw/gettimeofday/;

my $time = gettimeofday; # Returns ssssssssss.uuuuuu in scalar context

print qq|$time{'yyyymmdd hh:mm:ss.mmm', $time}\n|;
于 2013-08-07T09:57:45.340 回答