PowerShell: 日時を比較して差(日数・時間数等)を取得する
PowerShellで2つの日時を比較して、
間隔(日数の差や時間の差)を求める場合、
New-TimeSpanコマンドレットを使用します。
New-TimeSpanコマンドレットはTimeSpanオブジェクトを作成し、
プロパティで日数、時間、分、秒などの間隔が取得できます。
New-TimeSpanコマンドレットの書式は次の通りです。
New-TimeSpan [[-Start] 開始日時] [[-End] 終了日時]
「開始日時」と「終了日時」には日時を表す文字列かDateTimeオブジェクトを指定します。 省略した場合は現在日時となります。
引数の指定例は次の通りです。
New-TimeSpan "2022/1/1" "2023/2/1" # -End は現在日時 New-TimeSpan -Start "2022/1/1" # -Start は現在日時 New-TimeSpan -End "2030/1/1" New-TimeSpan "2022/1/1" (Get-Date)
開始日時を"2022/1/1"、終了日付を1か月後の"2022/2/1"として TimeSpanオブジェクトを作成し、値を表示してみます。 時間については両方とも"00:00:00"です。
$ts = New-TimeSpan "2022/1/1" "2022/2/1" $ts # 実行結果 Days : 31 Hours : 0 Minutes : 0 Seconds : 0 Milliseconds : 0 Ticks : 26784000000000 TotalDays : 31 TotalHours : 744 TotalMinutes : 44640 TotalSeconds : 2678400 TotalMilliseconds : 2678400000
TimeSpanオブジェクトは構造体となっており、 上の実行結果で表示されているプロパティがあります。
取得できる項目としては日数、時間、分、秒、ミリ秒があり、 次のプロパティで取得します(年と月はありません)。
項目 | プロパティ1 | プロパティ2 |
---|---|---|
日 | Days | TotalDays |
時間 | Hours | TotalHours |
分 | Minutes | TotalMinutes |
秒 | Seconds | TotalSeconds |
ミリ秒 | Milliseconds | TotalMilliseconds |
時間関連の項目はTotalが付くか付かないかによって値が異なります。 例えばHoursは時間部分の差を求めるのに対し、 TotalHoursは2つの日時を時間数に直したときの差を求めます。 上の例ではHoursは0ですが、 TotalHoursは「31日x24時間 = 744時間」となります。 必要に応じてプロパティを使い分けてください。
各プロパティを指定するには次のように記述します。
$ts = New-TimeSpan "2022/1/1" "2022/2/1" $ts.TotalDays $ts.TotalHours # 実行結果 31 744
最初の段階でTimeSpanオブジェクトを作成するために、 New-TimeSpanコマンドレットを使用すると書きましたが、 実はNew-TimeSpanコマンドを使わなくてもTimeSpanオブジェクトを作成できます。
次のように2つのDateTimeオブジェクトを引き算するだけでも TimeSpanオブジェクトを作成できます。 この場合は最初に終了日時、後に開始日時を記述します。
$ts = [datetime]"2022/2/1" - [datetime]"2022/1/1" $ts.TotalDays # 実行結果 31
PowerShellに慣れていない段階ではNew-TimeSpanコマンドレットを使った 方がわかりやすいと思います。 慣れたら好きな方を使ってください。
(まとめ記事: PowerShell 日付・時刻)