【问题标题】:How can I convert a time to hh:mm:ss format in Perl?如何在 Perl 中将时间转换为 hh:mm:ss 格式?
【发布时间】:2015-10-11 23:14:26
【问题描述】:

我们需要将数字格式的时间列转换为标准时间格式,即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

我该如何解决这个问题?

【问题讨论】:

  • 我试过这个使用 POSIX qw(strftime); printf(strftime("%H:%M:%S",localtime(1500)));但是输出是 00:25:00,我需要输出是 00:15:00
  • 我已将您的代码添加到问题中。您也可以通过单击edit 自己执行此操作。不起作用的原因是localtime 需要纪元秒并将它们转换为日期和时间表示。但你没有秒。你只是有一个格式错误的时间戳。

标签: perl posix strftime


【解决方案1】:

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

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

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

say $formatted;

输出

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

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

【讨论】:

  • 是的,感谢这项工作,但接下来是数字是 24 小时格式,我需要将其转换为 12 小时格式。即如果它的 130000 那么它应该是 01:00:00
  • 请为此创建一个新问题并先尝试自己
  • 这里可以同时使用sprintf和正则表达式吗?我的意思是只在 printf 中我需要做填充和正则表达式来插入冒号:在每两个数字之后
  • 你的意思是保存一行?如果您的 perl 足够新,可以使用 /r 修饰符,则可以。 my $formatted = sprintf('%06d', $date) =~ s/.../.../r; 你需要 Perl 5.14。 perldoc.perl.org/perl5140delta.html#Regular-Expressions
【解决方案2】:

更新

要将 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

【讨论】:

  • 因为我在低质量帖子评论部分看到了这个,所以我会在这里留下一个注释:请添加一些解释。 :)
  • 当然可以,但是 OP 能理解它吗?教人钓鱼什么的
  • 我添加了一个新的解决方案,允许从 24 小时转换为 12 小时时间
【解决方案3】:

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

#!/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

【讨论】:

  • 这不能回答问题。 OP 想知道如何将时间字符串转换为可读的表示,而不是显示当前时间。
  • 感谢您的回复,但是当我将值设置为 localtime(1500) 时,仍然无法将输出设为 00:25:00,预期输出为 00:15:00
  • perlmaven.com/simple-timestamp-generation-using-posix-strftime 使用本教程。你可以得到一个想法,
  • 他没有生成时间戳。他正在将时间戳从一种格式转换为另一种格式。
猜你喜欢
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多