none
PowerShell で8月31日を GetDateすると9月1日になる RRS feed

  • 質問

  • PowerShell上で下記を実行すると、取得したい8/31ではなく翌日の9/1と表示されます。

    (Get-Date -Day 31).AddMonths(-1)

    2019年9月1日 hh:mm:ss


    試しにその前の月を実行しても7/31ではなく翌日の8/1と表示されます。

    (Get-Date -Day 31).AddMonths(-2)
    2019年8月1日 hh:mm:ss

    先月実行した際は問題なく7/31と表示されたと記憶しています。

    仕様に変更が生じたのでしょうか?

    2019年9月6日 11:00

回答

  • Get-Dateのヘルプによると、

    If the specified value is greater than the number of days in a month, PowerShell adds the number of days to the month. For example, Get-Date -Month 2 -Day 31 displays March 3, not February 31.

    ということなので、以前からの仕様のようですが?

    <追記>今9月なので、Get-Date -Day 31は9/31を指し、返されるのは10/1。1か月前は9/1だし2か月前は8/1。

    <もう一つ追記>「先月末」であれば、(Get-Date -Day 1).AddDays(-1)で取得できます。

    2019年9月6日 11:17
  • >(Get-Date -Day 31).AddMonths(-1)

    数学的にもカッコ内を先に演算するのだから

    (9月31日).AddMonths(-1) 、つまり、(10月1日).AddMonths(-1) の結果が反って当然かと。

    2019年9月6日 11:53

すべての返信

  • Get-Dateのヘルプによると、

    If the specified value is greater than the number of days in a month, PowerShell adds the number of days to the month. For example, Get-Date -Month 2 -Day 31 displays March 3, not February 31.

    ということなので、以前からの仕様のようですが?

    <追記>今9月なので、Get-Date -Day 31は9/31を指し、返されるのは10/1。1か月前は9/1だし2か月前は8/1。

    <もう一つ追記>「先月末」であれば、(Get-Date -Day 1).AddDays(-1)で取得できます。

    2019年9月6日 11:17
  • Get-Dateのヘルプさん


    早々にご回答くださりありがとうございます。

    確かに、2月は28日までしかないので、31日を指定すると

    2月28日の3日後の3月3日と表示されるのは理解しています。

    8月や7月は31日まであるので、31日と表示されると想定していたのですが

    何か考え違いをしている部分があるのでしょうか?

    2019年9月6日 11:27
  • Get-Date は「今日の日時」を返します。そして現在は 8 月ではなく 9 月です。

    「Get-Date」が[令和元年9月6日 20:23:16] を返すとするなら、
    「Get-Date -Day 30」は[令和元年9月30日 20:23:16] 
    「Get-Date -Day 31」は[令和元年10月1日 20:23:16]です。

    当月が 2月の時に「Get-Date -Day 31」を実行すると、
    2020年の場合は閏年なので 2020/03/02
    2021年の場合は平年なので 2021/03/03 です。

    2019年9月6日 11:33
  • >(Get-Date -Day 31).AddMonths(-1)

    数学的にもカッコ内を先に演算するのだから

    (9月31日).AddMonths(-1) 、つまり、(10月1日).AddMonths(-1) の結果が反って当然かと。

    2019年9月6日 11:53
  • M14Clusterさん

    返信ありがとうございます。

    ようやく理解できました。

    丁寧な解説ありがとうございました。

    先月この関数を実行したとき、

    8月、7月ともに31日まであるのでたまたま結果が出ていただけですね。

    2019年9月6日 12:38
  • Hongliangさん

    追加でのご回答ありがとうございました。

    M14Clusterさんの解説で

    初歩的な間違いを起こしていたことに気づきました。

    括弧()が先に計算されますよね。

    お恥ずかしい限りです。

    実は先月末日だけを取得したいのではなく、

    先月(もしくは何か月前か)1か月分の日付を取得したいというのが課題でした。

    $lastMonth = (Get-Date).AddMonths(-1).ToString("MM")

    $lastmonthdays = (Get-Date -Day 1).AddDays(-1).ToString("dd")

    for($i = 1;$i -le $lastmonthdays; $i++){

      Write-Host (Get-Date -Month $lastMonth -Day $i).ToString("yyyyMMdd")

    }

    等で解決するようにします。

    ご回答誠にありがとうございました。

    2019年9月6日 12:51
  • 魔界の仮面弁士さん

    回答ありがとうございました。

    他の方からも回答をいただき理解することができました。

    2019年9月6日 13:02
  • 私ならこうかな。

    1..((date -day 1).adddays(-1).day)

    2019年9月6日 13:30