Perl 将带有 pm 的日期时间转换为 gmtime

Perl convert datetime with pm to gmtime

我在变量中获取数据库日期,需要将日期从 12 小时格式转换为 24 小时格式。

例如,日期 Jun 19 2019 11:08pm 应转换为 Jun 19 2019 23:08

这是我不成功的尝试:

#!/usr/bin/perl 
use strict; 
use warnings; 
use feature 'say'; 
use Time::Piece; 

my $date="Jun 19 2019 11:08pm"; 
for (qw[$date]) { 
    my $time = Time::Piece->strptime($_, '%H%p'); 
    say $time->strftime('%H:%M:%S'); 
}
use strict;
use warnings;
use feature 'say';

use Time::Piece;

my $date="Jun 19 2019 11:08pm";

# strptime %I:%M%p matches 12-hour with am/pm
# strftime %H converts to 24-hour
$date = Time::Piece->strptime($date, '%b %d %Y %I:%M%p')->strftime('%b %d %Y %H:%M');

say $date;

# Jun 19 2019 23:08

在评论中,您说:

#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use Time::Piece;

my $date="Jun 19 2019 11:08pm";

for (qw[$date]) {
  my $time = Time::Piece->strptime($_, '%H%p');
  say $time->strftime('%H:%M:%S');
 }

“不起作用”。

好吧,“不起作用”是一个非常无用的错误报告。如果我 运行 你的代码,我会得到一个非常有用的错误。

Error parsing time at /usr/lib64/perl5/Time/Piece.pm line 598

这告诉我们,问题几乎可以肯定是您使用的解析格式(“%H%p”)与您的日期字符串(“Jun 19 2019 11:08pm”)不匹配。这似乎很可能,因为“%H”匹配 24 小时制的一个小时,而“%p”匹配“am/pm”指示符。而您的日期字符串包含的信息远不止于此。

Time::Piece point you at the strptime man page 的文档以获取格式的更多详细信息。花几分钟看一下,您会发现一种更具包容性的解析格式。类似“%b %d %Y %I:%M%p”的内容。

所以现在您的代码如下所示:

#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use Time::Piece;

my $date="Jun 19 2019 11:08pm";

for (qw[$date]) {
  my $time = Time::Piece->strptime($_, '%b %d %Y %I:%M%p');
  say $time->strftime('%H:%M:%S');
}

但这给了我们同样的错误。我花了大约一分钟的时间才弄清楚这里的问题是什么。就是这一行:

for (qw[$date])

我不确定你在那里试图做什么,但 qw[$date] 创建了一个包含单个元素的列表,该元素是文字字符串“$date” - 而不是变量字符串的内容,它是(我怀疑)你想要的。

如果我们将其简化为 for ($date),那么解析工作正常,我们将得到输出“23:08:00”。这仍然不是您所说的您想要的输出格式,但那是因为您缺少一些必要的输出格式 - 而不仅仅是“%H:%M:%S”,您需要“%b %d %Y” %H:%M:%S”。修复该问题将为您提供所需的输出。

显然,for 循环在这里完全没有必要。您可以只使用 $date 作为 strptime() 的参数而不是 $_。但我已经离开了循环的结构,因为我怀疑你的真实代码会使用它。

更新:你原代码中的误区真有意思。我很想听到更多有关引导您编写此代码的思维过程的信息。也许我们可以改进该模块的文档以防止其他人遇到类似问题。