我在變數中獲取資料庫日期,需要將日期從 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');
}
uj5u.com熱心網友回復:
在評論中,你說:
#!/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手冊頁以獲取有關格式的更多詳細資訊。花幾分鐘的時間看看它會讓你得到一種更具包容性的決議格式。類似于“%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作引數 tostrptime()而不是$_。但是我已經離開了回圈的結構,因為我懷疑您的真實代碼會使用它。
更新:您原始代碼中的誤解非常有趣。我很想聽聽更多關于引導您撰寫此代碼的思維程序的資訊。也許我們可以改進模塊的檔案以防止其他人遇到類似的問題。
uj5u.com熱心網友回復:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/325502.html
上一篇:如何在Mule4中組合日期和時間以獲得這種格式yyyy-MM-ddTHH:mm:ss.SSSZ
下一篇:在時間范圍內為每一分鐘創建行
