PowerShellで経過した年月日を計算するには

ある日から、ある日まで。

その間が何日間かは、PowerShellの標準の機能で、簡単に計算できるようですが。

ついでと言っては何ですが。

何年と何月と何日間経過したかを計算するクラスを作成したいと思います。


PowerShellで経過日数と経過年月日の計算手順

経過日数

たとえば、下記を調べたい場合。

  • 1873年(明治6年)6月15日から、今日まで何日間?

PowerShellのNew-TimeSpanコマンドレットで調べることが可能です。

New-TimeSpan -Start (Get-Date -Year 1873 -Month 6 -Day 15)

System.TimeSpanオブジェクトが生成されて、TotalDaysプロパティに「55153」が入ります。

New-TimeSpanの-Endオプションを省略したため、これは本日までの経過日数になります。

何日経過したかを知りたい場合は、New-TimeSpanコマンドレットと、TimeSpanオブジェクトを使用すれば良さそうです。

オブジェクトの型名が「TimeSpan」「時間の間隔」ということで、時・分・秒・ミリ秒を取り扱うことが可能で、プロパティやメソッドが用意されています。

しかし、年・月・日については扱うことができない、経過した年月は計算できない仕様のようです。


経過年月日

そのようなわけで。経過年月日を知るために。クラスを作成してみました。

# Powershell ちょっとした日付処理クラス
# © 2024 denor.jp
class DenorDateSpan {
    [Int] $Years     #経過年
    [Int] $Months #経過月
    [Int] $Days      #経過日
    # いつからいつまで、何年何月何日経過したか計算
    static [DenorDateSpan] BetweenToday([Int]$SrcYear, [Int]$SrcMonth, [Int]$SrcDay) {
        $span = [DenorDateSpan]::new()
        $DstDate = Get-Date # いつまで
        if ($DstDate -lt (Get-Date -Year $SrcYear -Month $SrcMonth -Day $SrcDay)) {
            throw #いつまでが、いつからより前はエラーを生成
        }
        $span.Years = $DstDate.Year - $SrcYear
        $span.Months = $DstDate.Month - $SrcMonth
        If($span.Months -lt 0) {
            $span.Years = $span.years -1
            $span.Months = $span.Months + 12
        }
        $span.Days = $DstDate.Day - $SrcDay
        if($span.Days -lt 0) {
            $span.Days = $span.Days +  
                ((Get-Date -Year $SrcYear -Month $SrcMonth -Day 1).AddDays(-1)).Day
            $span.Months = $span.Months - 1
        }
        # 月が0以下なら年から繰り下げ
        If($span.Months -lt 0) {
            $span.Years = $span.years -1
            $span.Months = $span.Months + 12
        }
        # 月が12月を超えれば年を繰り上げ
        If($span.Months -ge 12) {
            $span.Years = $span.years +1
            $span.Months = $span.Months - 12
        }
        return $span
    } 
}

# 経過年月日の計算
$DateSpan = [DenorDateSpan]::BetweenToday(1873, 6, 15) # 明治6年 栃木県民の日
$DateSpan

先ほどと同様「1873年(明治6年)6月15日から今日まで」を計算してみました。

151年と1日。昨日が栃木県民の日のため、翌日はDaysが1で合っているようです。

明治6年(1873年)から令和6年(2024年)の間隔も、151年で合っていると思います。

別の日で計算するには、下から2行目の「BetweenToday」関数の引数を、対象の年月日に変更して見て下さい。

お隣茨城県民の日を入れてみると。

そうですか。廃藩置県から152年経過しましたか。

BetweenToday()の引数は、今日より以前の値を入れて使用して下さい。

未来の日付の計算は対応しないため、例外が投げられてエラー終了になりますのでご注意下さい。


経過年月日の計算ロジックですが。

算出された1年間は、閏年とそうではない年がありますが、どちらも「1年」の扱いになり、計算対象の日付によって、1年間の日数が異なる場合があります。

同様に、1月の日数も、28日の月もあれば31日の月もありますが。計算対象の前月が鍵になります。

ロジックにバグが有る可能性も御座います。動作保証はありません。

計算結果に誤りがあっても、自己責任でご使用下さい。

以上にご注意の上、よろしければ使用して見て下さい。

スポンサーリンク

フォローする

スポンサーリンク