業務系システムでよく使う日付演算


業務系システムでは年度や末日などの日付演算を行う場面が多いです。汎用メソッドとして実装してみました。ソースコードは [GitHub](https://github.com/mxProject/Misc/tree/master/source/DateTimeUtility) にあります。

### 月の差を取得する：GetMonthDiff

```c#
DateTime date1 = new DateTime(2018, 1, 1);
DateTime date2 = new DateTime(2018, 3, 31);
Debug.WriteLine(DateTimeUtility.GetMonthDiff(date1, date2));
Debug.WriteLine(DateTimeUtility.GetMonthDiff(date2, date1));
---
2
-2

// 拡張メソッド版
Debug.WriteLine(date1.GetMonthDiff(date2));
Debug.WriteLine(date2.GetMonthDiff(date1));
---
2
-2
```

### 会計年度を取得する：GetFiscalYear

```c#
DateTime date1 = new DateTime(2018, 1, 1);
// 年度の開始月を引数で指定する
Debug.WriteLine(DateTimeUtility.GetFiscalYear(date1, 4));
Debug.WriteLine(DateTimeUtility.GetFiscalYear(date1, 1));
---
2017
2018

// 拡張メソッド版
Debug.WriteLine(date1.GetFiscalYear(4));
Debug.WriteLine(date1.GetFiscalYear(1));
---
2017
2018
```

### 会計年度の初日を取得する：GetFirstDateOfFiscalYear

```c#
DateTime date1 = new DateTime(2018, 1, 1);
// 年度の開始月を引数で指定する
Debug.WriteLine(DateTimeUtility.GetFirstDateOfFiscalYear(date1, 4));
Debug.WriteLine(DateTimeUtility.GetFirstDateOfFiscalYear(date1, 1));
---
2017/04/01 0:00:00
2018/01/01 0:00:00

// 拡張メソッド版
Debug.WriteLine(date1.GetFirstDateOfFiscalYear(4));
Debug.WriteLine(date1.GetFirstDateOfFiscalYear(1));
---
2017/04/01 0:00:00
2018/01/01 0:00:00
```

### 会計年度の最終日を取得する：GetLastDateOfFiscalYear

```c#
DateTime date1 = new DateTime(2018, 1, 1);
// 年度の開始月を引数で指定する
Debug.WriteLine(DateTimeUtility.GetLastDateOfFiscalYear(date1, 4));
Debug.WriteLine(DateTimeUtility.GetLastDateOfFiscalYear(date1, 1));
---
2018/03/31 0:00:00
2018/12/31 0:00:00

// 拡張メソッド版
Debug.WriteLine(date1.GetLastDateOfFiscalYear(4));
Debug.WriteLine(date1.GetLastDateOfFiscalYear(1));
---
2018/03/31 0:00:00
2018/12/31 0:00:00
```

### 会計四半期の初日を取得する：GetFirstDateOfQuarter

```c#
DateTime date1 = new DateTime(2018, 1, 1);
// 対象日付と年度の開始月を引数で指定する
Debug.WriteLine(DateTimeUtility.GetFirstDateOfQuarter(date1, 4));
Debug.WriteLine(DateTimeUtility.GetFirstDateOfQuarter(date1, 2));
// 年度, 四半期, 年度の開始月を引数で指定する
Debug.WriteLine(DateTimeUtility.GetFirstDateOfQuarter(2018, QuarterPeriod.First, 4));
Debug.WriteLine(DateTimeUtility.GetFirstDateOfQuarter(2018, QuarterPeriod.Second, 4));
Debug.WriteLine(DateTimeUtility.GetFirstDateOfQuarter(2018, QuarterPeriod.Third, 4));
Debug.WriteLine(DateTimeUtility.GetFirstDateOfQuarter(2018, QuarterPeriod.Fourth, 4));
---
2018/01/01 0:00:00
2017/11/01 0:00:00
2018/04/01 0:00:00
2018/07/01 0:00:00
2018/10/01 0:00:00
2019/01/01 0:00:00

// 拡張メソッド版
Debug.WriteLine(date1.GetFirstDateOfQuarter(4));
Debug.WriteLine(date1.GetFirstDateOfQuarter(2));
---
2018/01/01 0:00:00
2017/11/01 0:00:00
```

### 会計四半期の最終日を取得する：GetLastDateOfQuarter

```c#
DateTime date1 = new DateTime(2018, 1, 1);
// 対象日付と年度の開始月を引数で指定する
Debug.WriteLine(DateTimeUtility.GetLastDateOfQuarter(date1, 4));
Debug.WriteLine(DateTimeUtility.GetLastDateOfQuarter(date1, 2));
// 年度, 四半期, 年度の開始月を引数で指定する
Debug.WriteLine(DateTimeUtility.GetLastDateOfQuarter(2018, QuarterPeriod.First, 4));
Debug.WriteLine(DateTimeUtility.GetLastDateOfQuarter(2018, QuarterPeriod.Second, 4));
Debug.WriteLine(DateTimeUtility.GetLastDateOfQuarter(2018, QuarterPeriod.Third, 4));
Debug.WriteLine(DateTimeUtility.GetLastDateOfQuarter(2018, QuarterPeriod.Fourth, 4));
---
2018/03/31 0:00:00
2018/01/31 0:00:00
2018/06/30 0:00:00
2018/09/30 0:00:00
2018/12/31 0:00:00
2019/03/31 0:00:00

// 拡張メソッド版
Debug.WriteLine(date1.GetLastDateOfQuarter(4));
Debug.WriteLine(date1.GetLastDateOfQuarter(2));
---
2018/03/31 0:00:00
2018/01/31 0:00:00
```

### 年の初日を取得する：GetFirstDateOfYear

```c#
DateTime date1 = new DateTime(2018, 4, 1);
Debug.WriteLine(DateTimeUtility.GetFirstDateOfYear(date1));
---
2018/01/01 0:00:00

// 拡張メソッド版
Debug.WriteLine(date1.GetFirstDateOfYear());
---
2018/01/01 0:00:00
```

### 年の最終日を取得する：GetLastDateOfYear

```c#
DateTime date1 = new DateTime(2018, 4, 1);
Debug.WriteLine(DateTimeUtility.GetLastDateOfYear(date1));
---
2018/12/31 0:00:00

// 拡張メソッド版
Debug.WriteLine(date1.GetLastDateOfYear());
---
2018/12/31 0:00:00
```

### 月の初日を取得する：GetFirstDateOfMonth

```c#
DateTime date1 = new DateTime(2018, 4, 4);
Debug.WriteLine(DateTimeUtility.GetFirstDateOfMonth(date1));
---
2018/04/01 0:00:00

// 拡張メソッド版
Debug.WriteLine(date1.GetFirstDateOfMonth());
---
2018/04/01 0:00:00
```

### 月の最終日を取得する：GetLastDateOfMonth

```c#
DateTime date1 = new DateTime(2018, 4, 4);
Debug.WriteLine(DateTimeUtility.GetLastDateOfMonth(date1));
---
2018/04/30 0:00:00

// 拡張メソッド版
Debug.WriteLine(date1.GetLastDateOfMonth());
---
2018/04/30 0:00:00
```

### 週の初日（日曜日）を取得する：GetFirstDateOfWeek

```c#
DateTime date1 = new DateTime(2018, 4, 4);
Debug.WriteLine(DateTimeUtility.GetFirstDateOfWeek(date1));
---
2018/04/01 0:00:00

// 拡張メソッド版
Debug.WriteLine(date1.GetFirstDateOfWeek());
---
2018/04/01 0:00:00
```

### 週の最終日（土曜日）を取得する：GetLastDateOfWeek

```c#
DateTime date1 = new DateTime(2018, 4, 4);
Debug.WriteLine(DateTimeUtility.GetLastDateOfWeek(date1));
---
2018/04/07 0:00:00

// 拡張メソッド版
Debug.WriteLine(date1.GetLastDateOfWeek());
---
2018/04/07 0:00:00
```

### 同じ週の指定曜日を取得する：GetDateOfCurrentWeek

```c#
DateTime date1 = new DateTime(2018, 4, 4);
Debug.WriteLine(DateTimeUtility.GetDateOfCurrentWeek(date1, DayOfWeek.Friday));
---
2018/04/06 0:00:00

// 拡張メソッド版
Debug.WriteLine(date1.GetDateOfCurrentWeek(DayOfWeek.Friday));
---
2018/04/06 0:00:00
```

### 翌週の指定曜日を取得する：GetDateOfNextWeek

```c#
DateTime date1 = new DateTime(2018, 4, 4);
Debug.WriteLine(DateTimeUtility.GetDateOfNextWeek(date1, DayOfWeek.Friday));
---
2018/04/13 0:00:00

// 拡張メソッド版
Debug.WriteLine(date1.GetDateOfNextWeek(DayOfWeek.Friday));
---
2018/04/13 0:00:00
```