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()
的参数而不是 $_
。但我已经离开了循环的结构,因为我怀疑你的真实代码会使用它。
更新:你原代码中的误区真有意思。我很想听到更多有关引导您编写此代码的思维过程的信息。也许我们可以改进该模块的文档以防止其他人遇到类似问题。
我在变量中获取数据库日期,需要将日期从 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()
的参数而不是 $_
。但我已经离开了循环的结构,因为我怀疑你的真实代码会使用它。
更新:你原代码中的误区真有意思。我很想听到更多有关引导您编写此代码的思维过程的信息。也许我们可以改进该模块的文档以防止其他人遇到类似问题。