2017-02-13 9 views
1

私は2つの日時の文字列を持っている:私は2つのdatetime文字列を持つperlの日付と時刻の違いを取得するには?

$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::DurationまたはStackOverflowを参照してください。

は、今すぐあなたの所望の出力を与える正しいコードは以下の通りです:

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オブジェクトに直接パースするには、DateTime::Format::Strptimeを使う方が良いでしょう。 (代わりにin_units()の)DateTimeの上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"; 
関連する問題