每當我試圖找到這些日期字串的差異時,都會出現一個錯誤。我想知道你是否能幫我解決這個問題。
my $datecreated = '2021-09-06 04:52:38'/span>;
my $dateresolved = '2021-09-06 04:52:48';
my $time_elapsed= $dateresolved - $datecreated;
print $time_elapsed;
而我想把結果轉換成分鐘和小時。
uj5u.com熱心網友回復:
這兩個時間戳僅僅是字串。為了得到這兩個時間點之間的持續時間("減去 "它們),我們需要在一個知道如何找到它們之間持續時間的庫中,從它們中建立日期-時間物件。 一個不錯的選擇是DateTime
use warnings;
use strict;
use feature 'say';
use DateTime;
使用 DateTime::Format::Strptime。
my ($ts1, $ts2) = (@ARGV == 2)
? @ARGV : ('2021-09-05 04:52:38'/span>, '2021-09-01 04:52:48'/span>)。
my $strp = DateTime::Format::Strptime->new(
pattern => '%F %T', time_zone => 'floating', on_error => 'croak'.
);
my ($dt1, $dt2) = map { $strp-> parse_datetime($_) } $ts1, $ts2;
# Get difference in hours and minutes (second discarded per question)
my ($hrs, $min) = delta_hm($dt1, $dt2)。
say "$hrs小時和$min分鐘"。
# Or (time-stamp hh:mm in scalar context)
my $ts_hm = delta_hm($dt1, $dt2)。
say $ts_hm;
# 要獲得想要的單位(這里是小時 分鐘)最好使用delta_X。
sub delta_hm {
my ($dt1, $dt2) = @_;
my ($min, $sec) = $dt1->delta_ms($dt2)->in_units('minutes', 'seconds') 。
my $hrs = int( $min / 60 ) 。
$min = $min % ($hrs*60) if $hrs;
return (wantarray) # discard seconds?
? ($hrs, $min)
: join ':'/span>, map { sprintf "d", $_ } $hrs, $min;
}
這里的硬編碼輸入時間戳與問題中的時間戳不同;那些會使小時 分鐘的差異為零,因為它們只在秒內有差異!
注意,一個通用的時間物件使其難以轉換為任何特定的所需單位
。一般來說,人們無法在秒、分、日和月之間進行轉換,因此這個類將永遠不會這樣做。取而代之的是,用所需的單位來創建持續時間,例如,通過在DateTime.pm物件上呼叫適當的減法/德爾塔方法。
所以上面我使用了delta_ms,因為分鐘很容易被轉換為小時 分鐘。正如問題所暗示的那樣,秒被丟棄了(如果這實際上是無意的,那么在例程中添加它們)。
但對于更普遍的用途,我們可以這樣做
use DateTime::Duration;
my $dur = $dt1-> subtract_datetime($dt2);
# Easy to extract parts of the duration, like>
say "小時。", $dur->小時," 和分鐘。", $dur->分鐘; # NOT conversion。
# This leaves out possible longer units (days, months, years)
可以用核心的Time::Piece也可以這樣做
。use warnings;
use strict;
use feature 'say';
use Time::Piece;
my ($ts1, $ts2) = (@ARGV)
? @ARGV : ('2021-09-05 04:52:38'/span>, '2021-09-01 04:52:48'/span>)。
my ($dt1, $dt2) = map { Time::Piece-> strptime($_, "%Y-%m-%d %T") } $ts1, $ts2;
# 在舊的模塊版本中,格式指定器`%F`(`%Y-%m-%d`)可能會失敗。
# 所以我在這里拼出來;%T(代表%H:%M:%S)應該總是好的。
# 對于本地時間(不是UTC)最好使用Time::Piece::localime->strptime。
my $delta = $dt1 - $dt2。
# say $delta->pretty;
my $hrs = int( $delta->小時)。
my $min = int($delta->minutes) - ($hrs//=0)*60;
say "$hrs:$min"/span>。
這就簡單多了,但要注意偶爾會出現的Time::Piece的棘手(錯誤)API。
注意,雖然Time::Piece是核心的、簡潔的、更輕的(和正確的!),但DateTime要更圓潤和強大,也有一個擴展的生態系統。
uj5u.com熱心網友回復:
使用Time::Piece,這是自2007年以來Perl庫的一個標準部分。
#!/usr/bin/perl。
use strict;
使用警告。
use Time::Piece;
# 定義輸入的格式。
my $format = '%Y-%m-%d %H:%M:%S'。
# 將你的日期字串轉換成Time::Piece物件。
my $datecreated = Time::Piece->strptime('2021-09-06 04:52:38', $format)。
my $dateresolved = Time::Piece->strptime('2021-09-06 04:52:48', $format)。
# Time::Piece物件可以相互減去。。
# This gives the elapsed time in seconds.
my $time_elapsed = $dateresolved - $datecreated。
# 做好計算,將經過的時間以小時為單位進行置換,
# minutes and seconds.。
printf "dh:dm:ds
"。
$time_elapsed->小時。
$time_elapsed->minutes % 60,
$time_elapsed->seconds % 60;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/311330.html
標籤:
上一篇:我如何在perl中使用單一的regex將一行劃分為代碼和注釋?
下一篇:如何復制網頁上的文字內容
