【问题标题】:Perl convert datetime with pm to gmtimePerl 将带有 pm 的日期时间转换为 gmtime
【发布时间】:2021-12-05 11:52:46
【问题描述】:

我在一个变量中得到一个数据库日期,需要将日期从 12h 格式转换为 24h 格式。

例如,日期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'); 
}

【问题讨论】:

  • #!/usr/bin/perl 使用严格;使用警告;使用功能“说”;使用时间::件;我的 $date="2019 年 6 月 19 日晚上 11:08"; for (qw[$date]) { my $time = Time::Piece->strptime($_, '%H%p');说 $time->strftime('%H:%M:%S'); } 没用
  • %H%p 不匹配 Jun 19 2019 11:08pm
  • 你试过什么?你有什么问题?请向我们展示您的代码(不在评论中)。
  • 报告“尝试失败”时,告诉我们您看到了哪些意外行为总是很有用的。什么都没发生吗?你收到错误信息了吗?你的电脑起火了吗?

标签: perl datetime localtime


【解决方案1】:

在评论中,你说:

#!/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');
 }

“不起作用”。

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

在 /usr/lib64/perl5/Time/Piece.pm 第 598 行解析时间出错

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

Time::Piece 的文档将您指向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() 的参数而不是$_。但是我已经离开了循环的结构,因为我怀疑你的真实代码会使用它。

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

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 2021-06-18
      相关资源
      最近更新 更多