PowerShellで日付を扱う

# データ型 書式 加減算

## 標準書式(Datetime型-String型間の双方向の変換可)

### Datetime型から文字列

```PowerShell
# 2019/12/31 という文字列を取得する（現在日時）
PS C:\Users\hidemaru> $DATE = Get-Date -Format "d" # -> 2019/12/31
2019/12/31

PS C:\Users\hidemaru> $DATE.GetType()
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object
```

### 文字列からDatetime型

```PowerShell
# 2019/12/31 という文字列からDatetime型で取得する
PS C:\Users\hidemaru> $DATE =[Datetime]"2019/12/31"
PS C:\Users\hidemaru> $DATE
2019年12月31日 0:00:00

PS C:\Users\hidemaru> $DATE.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     DateTime                                 System.ValueType

```

標準書式の形式のパターン

* 2019/12/31 ( `$DATE.ToShortDateString()` or `$DATE.ToString("d")` )
* 2019/12/31 0:00
* 2019/12/31 0:00:00
* 2019年12月31日 ( `$DATE.ToLongDateString()` or `$DATE.ToString("D")` )
* 2019年12月31日 0:00
* 2019年12月31日 0:00:00

[出典：Standard date and time format strings](https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings)

## カスタム書式(Datetime型からString型へのみ)
@nukie_53 さんよりコメ欄にて
カスタム書式のString型からDatetime型への変換方法をご紹介いただきたました。
https://qiita.com/hidemaru/items/5c60adf45f746aa40dd1#comment-5ac7fdad2356d083d9ee

書式文字を複数文字使った場合に、カスタム書式になる。

```PowerShell
# 20191231 という文字列を取得する（現在日時）
PS C:\Users\hidemaru> $DATE = Get-Date -Format "yyyyMMdd" # -> 20191231
PS C:\Users\hidemaru> $DATE.GetType()                                                                                   
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object
```

※秒(ss)、ナノ秒(fffffffff)
※書式文字列は .Net のフォーマットに同じ
[Custom date and time format strings](https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings?view=netframework-4.8)



## 日付の計算

### 年、月、日 を足す

```PowerShell
# 2019/12/31 に 1年足す
PS C:\Users\hidemaru> $DATE.AddYears(1)                                                                                 
2020年12月31日 0:00:00

# 2019/12/31 に 1月足す
PS C:\Users\hidemaru> $DATE.AddMonths(1)                                                                                
2020年1月31日 0:00:00

# 2019/12/31 に 1日足す
$DATE = Get-Date # -> 2019/12/31
PS C:\Users\hidemaru> $DATE.AddDays(1)
2020年1月1日 0:00:00
```

### 日付から日付を引く(日付の差分)

```PowerShell
# 2019/12/31 から 2020/01/01 の期間（1日前）
PS C:\Users\hidehiko> $DATE.Subtract([Datetime]"2020/01/01")                                                            

Days              : -1
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 0
Ticks             : -864000000000
TotalDays         : -1
TotalHours        : -24
TotalMinutes      : -1440
TotalSeconds      : -86400
TotalMilliseconds : -86400000

```


戻り値の方は以下を参照。
[出典：TimeSpan 構造体](https://docs.microsoft.com/ja-jp/dotnet/api/system.timespan?view=netcore-3.1)

## リンク

[Get-Date リファレンス](https://docs.microsoft.com/ja-jp/powershell/module/Microsoft.PowerShell.Utility/Get-Date?view=powershell-5.1)