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
DaysTotalDays
時間HoursTotalHours
MinutesTotalMinutes
SecondsTotalSeconds
ミリ秒MillisecondsTotalMilliseconds

時間関連の項目は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 日付・時刻

PowerShell