Perl:如何漂亮地打印时间差(持续时间)

sds*_*sds 5 perl datetime duration datediff

我如何在 Perl 中漂亮地打印持续时间?

到目前为止我唯一能想到的是

my $interval = 1351521657387 - 1351515910623; # milliseconds
my $duration = DateTime::Duration->new(
    seconds => POSIX::floor($interval/1000) ,
    nanoseconds  => 1000000 * ($interval % 1000),
);
my $df = DateTime::Format::Duration->new(
    pattern => '%Y years, %m months, %e days, ' .
               '%H hours, %M minutes, %S seconds, %N nanoseconds',
    normalize => 1,
);
print $df->format_duration($duration);
Run Code Online (Sandbox Code Playgroud)

这导致

0 years, 00 months, 0 days, 01 hours, 35 minutes, 46 seconds, 764000000 nanoseconds
Run Code Online (Sandbox Code Playgroud)

这对我来说没有好处,原因如下:

  1. 我不想看到“ 0 年”(空间浪费)&c,并且我不想从其中删除“ %Y 年pattern” (如果下次我确实需要几年怎么办?)
  2. 我事先知道我的精度只有毫秒,我不想看到纳秒部分的 6 个零。
  3. 我更关心美观/紧凑/人类可读性而不是精度/机器可读性。即,我想看到类似“ 1.2 年”或“ 3.22 个月”或“ 7.88 天”或“ 5.7 小时”或“ 75.5 分钟”(或“ 1.26 小时”,无论你看起来更好)或“ 24.7 秒”或“ 133.7 毫秒” &c (类似于R打印difftime 的方式)

tit*_*old 3

您可以根据某些值是否为“true”来动态构建模式。

...
push @pattern, '%Y years' if $duration->year;
push @pattern, '%m months' if $duration->month;
...
my $df = DateTime::Format::Duration->new(
    pattern => join(', ', @pattern),
    normalize => 1,
);
print $df->format_duration($duration);
Run Code Online (Sandbox Code Playgroud)