如何在 Perl 中将时间转换为 hh:mm:ss 格式?
How can I convert a time to hh:mm:ss format in Perl?
我们需要将数字格式的时间列转换为标准时间格式,即 perl 中的 hh:mm:ss。
示例:
- 如果时间值为
1500
,转换后的值应该是00:15:00
。
- 如果时间值为
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%p
。 sprintf
仍然是必要的,作为用零填充字符串到六位数字的初始步骤
此示例程序每小时格式化并打印从 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
我们需要将数字格式的时间列转换为标准时间格式,即 perl 中的 hh:mm:ss。
示例:
- 如果时间值为
1500
,转换后的值应该是00:15:00
。 - 如果时间值为
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%p
。 sprintf
仍然是必要的,作为用零填充字符串到六位数字的初始步骤
此示例程序每小时格式化并打印从 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