月の集計で使う日付文字列を作りたい
JSONの日付部分だけ置き換えて一か月分のデータ集計をするため、日付文字列を生成したい。
先にカレンダーをリテラルで用意したり、毎日分雑に31回決め打ち処理…はかっこわるいので、日付関係のオブジェクトを利用する。西向く侍もうるう年も心配ないようにする。
ISO8601形式
日付表現は日付+時刻のISO8601形式を使う。
日付の取り扱いでよく使う形式。詳しくは省略。
20210104T00:00:00 #基本
2021-01-04T00:00:00 #拡張
DateTimeオブジェクトの生成
$Year = "2021"
$Month = "1" #"01"でなくてもよい
$Day = "1"
$Date1 = Get-Date -Year $Year -Month $Month -Day $Day
$Date1.GetType() #DateTime型
$Date1 #時刻は現在時刻になる
$Date2 = New-Object DateTime $Year,$Month,$Day
$Date2.GetType() #DateTime型
$Date2 #時刻は00:00:00になる
Get-Date
コマンドレット、またはNew-Object DateTime
で年月日を指定してDateTimeオブジェクトを生成する。
Get-Date
コマンドレットだと指定しない時刻部分はシステムの現在時刻になる。
New-Object DateTime
だと指定しない時刻部分は00:00:00になる。
時刻は主に00:00:00で使うのでNew-Object DateTime
で出したくなるのだが、時刻は時刻で別途指定する場合があるので、生成した日付+時刻から日付部分だけ取り出すことにする。
なので、今回はどちらの方法で生成しても同じである。
日付オブジェクトを一か月分回す
AddDays
メソッドで日付を加算減算できる。月の末日に1日加えると翌月になってくれるので、翌月になったら処理終了にする。
$Year = "2021"
$Month = "1"
$Day = "30"
$Date = Get-Date -Year $Year -Month $Month -Day $Day
$Date #2021年1月30日
$Date.AddDays(1) #2021年1月31日
$Date.AddDays(2) #2021年2月1日
ISO8601拡張形式で一カ月分の日付を生成
# ユーザー入力
Write-Output "年と月を入力"
$Year = Read-Host "年 yyyy"
$Month = Read-Host "月 MM"
$Day = "1"
$Date = Get-Date -Year $Year -Month $Month -Day $Day
# 日付の入った配列生成
$ThisMonth = $Date.Month
$Calendar = New-Object System.Collections.ArrayList
while($Date.Month -eq $ThisMonth){
$Calendar.Add($Date.ToString("yyyy-MM-dd")) > $NULL
$Date = $Date.AddDays(1)
}
# 配列に文字列型で入っているので、あとから時刻を付け足す
# 表示だけなら
$Calendar | ForEach-Object{
"${_}T00:00:00"
}
# 2020-01-01T00:00:00
# ~(中略)~
# 2020-01-31T00:00:00