如何在 Perl 中将时间转换为 hh:mm:ss 格式?

How can I convert a time to hh:mm:ss format in Perl?

我们需要将数字格式的时间列转换为标准时间格式,即 perl 中的 hh:mm:ss。

示例:

  1. 如果时间值为1500,转换后的值应该是00:15:00
  2. 如果时间值为11500,转换后的值应该是01:15:00

我试过这个:

use POSIX qw(strftime); 
printf( strftime("%H:%M:%S",localtime(1500))); 

但是输出是00:25:00,我需要输出是00:15:00

我该如何解决这个问题?

您首先需要通过添加左零填充来使数字达到六位数。之后,需要在每两位数字后插入冒号:。最简单的方法是使用 sprintf 和正则表达式。

use strict;
use warnings;
use feature 'say';

my $date = '11500';
my $formatted = sprintf '%06d', $date;
$formatted =~ s/(\d\d)(\d\d)(\d\d)/::/;

say $formatted;

输出

01:15:00
00:15:00 (for 1150)

请注意,长度大于 6 的字符串会中断。

我找到了这段代码,请试试

#!/usr/local/bin/perl

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();

printf("Time Format - HH:MM:SS\n");
printf("%02d:%02d:%02d", $hour, $min, $sec);

我们的看跌期权: 时间格式 - HH:MM:SS 06:58:52

更新

要同时将 24 小时制转换为 12 小时制,最好使用 Time::Piece 模块将 %H%M%S 转换为 %I:%M:%S%psprintf 仍然是必要的,作为用零填充字符串到六位数字的初始步骤

此示例程序每小时格式化并打印从 5900 到 235900 的时间值

use strict;
use warnings;
use 5.010;

use Time::Piece;

say format_time(1500);
say format_time(11500);
say '';

for my $time (0 .. 23) {
    $time = $time * 10000 + 5900;
    say format_time($time);
}

sub format_time {
    my ($time) = @_;
    $time = Time::Piece->strptime(sprintf('%06d', $time), '%H%M%S');
    lc $time->strftime('%I:%M:%S%p');
}

产出

12:15:00am
01:15:00am

12:59:00am
01:59:00am
02:59:00am
03:59:00am
04:59:00am
05:59:00am
06:59:00am
07:59:00am
08:59:00am
09:59:00am
10:59:00am
11:59:00am
12:59:00pm
01:59:00pm
02:59:00pm
03:59:00pm
04:59:00pm
05:59:00pm
06:59:00pm
07:59:00pm
08:59:00pm
09:59:00pm
10:59:00pm
11:59:00pm

原解

在此解决方案中,sprintf('%06d', $time) 用于使用零将字符串填充为六位数字,并且 /../g 将结果拆分为两个字符的(三个)块。 join ':' 重新组合中间带有冒号的块以实现所需的模式

my $time = 1500;

my $converted = join ':', sprintf('%06d', $time) =~ /../g;

print $converted, "\n";

产出

00:15:00