2017-02-13 22 views
1

我有兩個日期時間字符串爲:如何在perl中獲得日期和時間的差異,我有兩個datetime字符串?

$bstr = 02/07/17 09:25:22 
$betr = 02/07/17 10:55:48 
my $bstrDateTime = DateTime->from_epoch(epoch => str2time($bstr)); 
my $betrDateTime = DateTime->from_epoch(epoch => str2time($betr)); 
my $diff = $betrDateTime->subtract_datetime($bstrDateTime); 

$diff_h = sprintf $diff->in_units('hours'); 
$diff_m = sprintf $diff->in_units('minutes'); 
$diff_s = sprintf $diff->in_units('seconds'); 

$difference = $diff_h.":".$diff_m.":".$diff_s; 
print $difference; 

但是我得到錯誤的分差。

輸出爲:1:90:48

我在哪裏做錯了?而不是90,應該是30.

回答

1

您目前正在使用in_units,但它沒有達到您的預期。由於它具有不同的功能,因爲它可以計算指定單位中給定對象之間的差異。只要它們兼容轉換。有關此更多信息,請參閱 - DateTime::DurationStackOverflow

現在正確的代碼,這將給您所需的輸出低於:

my $bstr = '02/07/17 09:25:22'; 
my $betr = '02/07/17 10:55:48'; 
my $bstrDateTime = DateTime->from_epoch(epoch => str2time($bstr)); 
my $betrDateTime = DateTime->from_epoch(epoch => str2time($betr)); 

my $diff = $betrDateTime->subtract_datetime($bstrDateTime); 

my $diff_h = $diff->hours; 
my $diff_m = $diff->minutes; 
my $diff_s = $diff->seconds; 

my $difference = $diff_h.":".$diff_m.":".$diff_s; 
print $difference; 

你也應該放在時間戳引號裏在你的代碼發佈和分號也缺少在第一幾行了。請記得運行您正在粘貼的代碼以避免這些類型的錯誤。

1

如果您給我們提供實際編譯的代碼,它會有所幫助,所以我們不必花時間修復缺少的分號和引號。使用str2time()並從時期創建DateTime對象有點浪費。最好使用DateTime::Format::Strptime直接將字符串解析爲DateTime對象。

使用DateTime :: Duration(而不是in_units())上的hours()minutes()seconds()方法會給你想要的結果。

use strict; 
use warnings; 

use DateTime::Format::Strptime; 

my $date_parser = DateTime::Format::Strptime->new(
    pattern => '%d/%m/%y %H:%M:%S', 
); 

my $bstr = '02/07/17 09:25:22'; 
my $betr = '02/07/17 10:55:48'; 
my $bstrDateTime = $date_parser->parse_datetime($bstr); 
my $betrDateTime = $date_parser->parse_datetime($betr); 
my $diff = $betrDateTime->subtract_datetime($bstrDateTime); 

print $diff->hours, ', ', $diff->minutes, ', ', $diff->seconds, "\n"; 
相關問題