date-fnsのメソッドでできること

# date-fnsのメソッドでできること

いい加減、日付ライブラリくらい使えるようになろうかなということで、date-fnsを調べたので、そのメモを残します。
当社調べでは…241個のメソッドを提供しているようです。頭悪いので、typescript定義ファイルを上から見ていきます。
全て見たつもりですが、見落としがあったらごめんなさい。責任は取れないです。

詳細はちゃんとドキュメントを読みましょう：<https://date-fns.org/docs/Getting-Started>

## まとめ

[良くわからんもの](＃良くわからんもの)を除き、date-fnsの[メソッド](#メソッド)を26個に分類した。

- 基本的なメソッド
  - [format](#format): Date型→文字列
  - [parse](#parse): 文字列→Date型
  - [add](#add): 足し算
  - [sub](#sub): 引き算
  - [get](#get): getter
  - [set](#set): setter
  - [is](#is): 判定いろいろ　※42個をひとまとめにしてしまったので、詳細はis節を参照。
  - [compare](#compare): 比較
- 役に立ちそうなメソッド
  - [differenceIn](#differencein): 2つの日付の間隔を、日付単位や年単位などで取得。
  - [previous/next](#previousnext): 次の月曜日や前の水曜日を取得。
  - [startOf/endOf](#startofendof): 日付の余計な部分をそぎ落としていい感じにしてくれる。
  - [lastDayOf](#lastdayof): ある特定の週や、年月・年などの最終日を取得。
  - [getXXinYY](#getxxinyy): ある年月に含まれる日付を返す等。
- 日付の配列に対するメソッド
  - [min/max](#minmax): 最古/最新を取得する。
  - [closest](#closest): 配列内の各日付で、最も指定した日付に近い日付を探す。
- 期間(独自のInterval型)に対するメソッド
  - [eachXXOfInterval](#eachxxofinterval): 指定した期間に含まれる要素を返却する。
  - [clamp](#clamp): 期間内で、ある日付に最も近い日付を返却する。
  - [overlappingInterval](#overlappinginterval): 期間の重なりの判定や重なりに含まれる日付の取得。
- その他マニアックそうなメソッド
  - [DefaultOptions](#defaultoptions): デフォルトオプション。週の開始曜日とか。
  - [roundToNearestMinutes](#roundtonearestminutes): 分単位についての四捨五入。
- 独自型の変換用
  - [intervalToDuration](#intervaltoduration)
  - [milliseconds](#milliseconds)
- 正直、いらなそうなメソッド
  - [conversion](#conversion)
  - [toDate](#todate)
  - [fromUnixTime](#fromunixtime)
  - [eachWeekendOf](#eachweekendof)

## 補足：バージョン

```text
    "date-fns": "2.30.0",
```

## 補足：Type

そもそも前提として、date-fnsはNodeJS標準のDate型を使うライブラリです。parseした結果は標準のDate型で受け取りますし、formatしたい日付は標準のDate型で指定することができます。
しかし、利便性のためか、以下の4点だけ独自の型定義を提供しているらしい。

- Locale
  - まぁ、ロケールでしょう。きっと…型定義見ましたが、複雑でした。
- Duration
  - 日付と日付の間隔。`3時間半`とか。`2カ月`とか。

```ts
type Duration = { years?: number, months?: number, weeks?: number, days?: number, hours?: number, minutes?: number, seconds?: number, };
```

- Interval
  - 開始～終了を持つ一定の期間。`2022年1月3日～2023年5月15日`とか。

```ts
type Interval = { start: Date | number, end: Date | number };
```

- Day
  - 曜日を示す型かな。。。

```ts
type Day = 0 | 1 | 2 | 3 | 4 | 5 | 6;
```

## メソッド

### 良くわからんもの

いきなりだけど、以下は良くわからんかった。

- [intlFormat](https://date-fns.org/v2.30.0/docs/intlFormat)
- [intlFormatDistance](https://date-fns.org/v2.30.0/docs/intlFormatDistance)
- [lightFormat](https://date-fns.org/v2.30.0/docs/lightFormat)

### add

日付に3時間を足し算したり、日付と期間を足したりできます。営業日を足すというものもあるが、祝日は考慮できなさそう。

- [add](https://date-fns.org/v2.30.0/docs/add)
- [addDays](https://date-fns.org/v2.30.0/docs/addDays)
- [addBusinessDays](https://date-fns.org/v2.30.0/docs/addBusinessDays)
- ...

### clamp

期間内で、ある日付に最も近い日付を返却する。

- [clamp](https://date-fns.org/v2.30.0/docs/clamp)

### closest

配列内の各日付で、最も指定した日付に近い日付を探す。

- [closestIndexTo](https://date-fns.org/v2.30.0/docs/closestIndexTo)
- [closestTo](https://date-fns.org/v2.30.0/docs/closestTo)

### compare

日付の比較。

- [compareAsc](https://date-fns.org/v2.30.0/docs/compareAsc)
- [compareDesc](https://date-fns.org/v2.30.0/docs/compareDesc)

### conversion

ミリ秒を時間に、日付を週間になど、単位を変える系。いろいろあるけど把握が面倒で使いづらそう…
date-fnsの検索欄で"Conversion Helpers"と入れると一覧表示される。

### DefaultOptions

ようわからんが、getter/setterがある。調べてみるとライブラリの使い道が増すかも。

- [getDefaultOptions](https://date-fns.org/v2.30.0/docs/getDefaultOptions)
- [setDefaultOptions](https://date-fns.org/v2.30.0/docs/setDefaultOptions)

### differenceIn

2つの日付の差を任意の単位で取得する。
また、differenceInCalendar版もある。これは、計算前に余計な部分をそぎ落としてくれるので、例えば`2000年12月31日`と`2020年1月1日`の間隔を`2020-2000 = 20`としてくれる。

- [differenceInDays](https://date-fns.org/v2.30.0/docs/differenceInDays)
- [differenceInCalendarDays](https://date-fns.org/v2.30.0/docs/differenceInCalendarDays)
- ...

### eachXXOfInterval

指定した期間に含まれる要素を返却する。例えば、1月1日～1月20日の間の日付（1～20日）とか。

- [eachDayOfInterval](https://date-fns.org/v2.30.0/docs/eachDayOfInterval)
- ...

### eachWeekendOf

年月・または年に含まれる週末だけを返してくれる。なぜこれだけあるんだろうか…

- [eachWeekendOfMonth](https://date-fns.org/v2.30.0/docs/eachWeekendOfMonth)
- [eachWeekendOfYear](https://date-fns.org/v2.30.0/docs/eachWeekendOfYear)

### startOf/endOf

日付の余計な部分をそぎ落としていい感じにしてくれる。月末とかね。Yesterday,Today,Tomorrow等もある。

- [startOfDay](https://date-fns.org/v2.30.0/docs/startOfDay)
- [endOfDay](https://date-fns.org/v2.30.0/docs/endOfDay)
- ...

### format

いろんなformatがある。文字列→日付。

- [format](https://date-fns.org/v2.30.0/docs/format)
- ...

### fromUnixTime

unixtimeから日付型を取得する。標準のDate型のコンストラクタと何が違うんだろうか。。。

- [fromUnixTime](https://date-fns.org/v2.30.0/docs/fromUnixTime)

### get

要素から時間等の1要素を取得する。※月はDate型と同じで-1した値になるので注意。1月は0、12月は11。

- [getDay](https://date-fns.org/v2.30.0/docs/getDay)
- ...

### getXXinYY

ある年月に含まれる日付を返すとか、そういう関数がちらほら。

- [getDaysInMonth](https://date-fns.org/v2.30.0/docs/getDaysInMonth)
- [getDaysInYear](https://date-fns.org/v2.30.0/docs/getDaysInYear)
- [getWeeksInMonth](https://date-fns.org/v2.30.0/docs/getWeeksInMonth)
- ...

### intervalToDuration

開始～終了の期間を元に、間隔（3日と4時間とか）を取得する。

- [intervalToDuration](https://date-fns.org/v2.30.0/docs/intervalToDuration)

### is

isから始まる判定メソッドが系42個ある。内訳は以下のとおり。

- 曜日等
  - [isSunday](https://date-fns.org/v2.30.0/docs/isSunday)
  - [isMonday](https://date-fns.org/v2.30.0/docs/isMonday)
  - [isTuesday](https://date-fns.org/v2.30.0/docs/isTuesday)
  - [isWednesday](https://date-fns.org/v2.30.0/docs/isWednesday)
  - [isThursday](https://date-fns.org/v2.30.0/docs/isThursday)
  - [isFriday](https://date-fns.org/v2.30.0/docs/isFriday)
  - [isSaturday](https://date-fns.org/v2.30.0/docs/isSaturday)
  - [isWeekend](https://date-fns.org/v2.30.0/docs/isWeekend)
- 月初/月末
  - [isFirstDayOfMonth](https://date-fns.org/v2.30.0/docs/isFirstDayOfMonth)
  - [isLastDayOfMonth](https://date-fns.org/v2.30.0/docs/isLastDayOfMonth)
- 現在との比較
  - [isThisHour](https://date-fns.org/v2.30.0/docs/isThisHour)
  - [isThisISOWeek](https://date-fns.org/v2.30.0/docs/isThisISOWeek)
  - [isThisMinute](https://date-fns.org/v2.30.0/docs/isThisMinute)
  - [isThisMonth](https://date-fns.org/v2.30.0/docs/isThisMonth)
  - [isThisQuarter](https://date-fns.org/v2.30.0/docs/isThisQuarter)
  - [isThisSecond](https://date-fns.org/v2.30.0/docs/isThisSecond)
  - [isThisWeek](https://date-fns.org/v2.30.0/docs/isThisWeek)
  - [isThisYear](https://date-fns.org/v2.30.0/docs/isThisYear)
  - [isFuture](https://date-fns.org/v2.30.0/docs/isFuture)
  - [isPast](https://date-fns.org/v2.30.0/docs/isPast)
  - [isToday](https://date-fns.org/v2.30.0/docs/isToday)
  - [isTomorrow](https://date-fns.org/v2.30.0/docs/isTomorrow)
  - [isYesterday](https://date-fns.org/v2.30.0/docs/isYesterday)
- 2つの日付を比較(特定要素で)
  - [isSameDay](https://date-fns.org/v2.30.0/docs/isSameDay)
  - [isSameHour](https://date-fns.org/v2.30.0/docs/isSameHour)
  - [isSameISOWeek](https://date-fns.org/v2.30.0/docs/isSameISOWeek)
  - [isSameISOWeekYear](https://date-fns.org/v2.30.0/docs/isSameISOWeekYear)
  - [isSameMinute](https://date-fns.org/v2.30.0/docs/isSameMinute)
  - [isSameMonth](https://date-fns.org/v2.30.0/docs/isSameMonth)
  - [isSameQuarter](https://date-fns.org/v2.30.0/docs/isSameQuarter)
  - [isSameSecond](https://date-fns.org/v2.30.0/docs/isSameSecond)
  - [isSameWeek](https://date-fns.org/v2.30.0/docs/isSameWeek)
  - [isSameYear](https://date-fns.org/v2.30.0/docs/isSameYear)
- 2つの日付を比較(その他)
  - [isAfter](https://date-fns.org/v2.30.0/docs/isAfter)
  - [isBefore](https://date-fns.org/v2.30.0/docs/isBefore)
  - [isEqual](https://date-fns.org/v2.30.0/docs/isEqual)
- その他いろいろ
  - [isExists](https://date-fns.org/v2.30.0/docs/isExists): 年月日の存在判定
  - [isDate](https://date-fns.org/v2.30.0/docs/isDate): Date型かどうかを判定
  - [isMatch](https://date-fns.org/v2.30.0/docs/isMatch): 文字列があるformatにmatchするか（そもそも解釈できるか）の判定
  - [isLeapYear](https://date-fns.org/v2.30.0/docs/isLeapYear): うるう年判定
  - [isValid](https://date-fns.org/v2.30.0/docs/isValid): Date型がそもそも不正かどうかの判定
  - [isWithinInterval](https://date-fns.org/v2.30.0/docs/isWithinInterval): 期間内かどうかの判定

### lastDayOf

ある特定の週や、年月・年などの最終日を取得。

- [lastDayOfMonth](https://date-fns.org/v2.30.0/docs/lastDayOfMonth)
- ...

### min/max

日付配列の中で、最古・最新の物を取得。

- [min](https://date-fns.org/v2.30.0/docs/min)
- [max](https://date-fns.org/v2.30.0/docs/max)

### milliseconds

期間をミリ秒単位に変換する。

- [milliseconds](https://date-fns.org/v2.30.0/docs/milliseconds)

### overlappingInterval

2つの期間の重なりに関するメソッド。重なりの判定や、重なっている日付の一覧取得。

- [areIntervalsOverlapping](https://date-fns.org/v2.30.0/docs/areIntervalsOverlapping)
- [getOverlappingDaysInIntervals](https://date-fns.org/v2.30.0/docs/getOverlappingDaysInIntervals)

### previous/next

次の月曜日とかを取得できる。

- [previousMonday](https://date-fns.org/v2.30.0/docs/previousMonday)
- [nextMonday](https://date-fns.org/v2.30.0/docs/nextMonday)
- ...

### parse

文字列を日付に変換する。

- [parse](https://date-fns.org/v2.30.0/docs/parse)
- ...

### roundToNearestMinutes

分単位についての四捨五入。なぜか分だけある…

- [roundToNearestMinutes](https://date-fns.org/v2.30.0/docs/roundToNearestMinutes)

### set

日付の特定要素だけを編集する。

- [set](https://date-fns.org/v2.30.0/docs/set)
- [setDayOfYear](https://date-fns.org/v2.30.0/docs/setDayOfYear)
- ...

### sub

日付から引き算を行う。

- [sub](https://date-fns.org/v2.30.0/docs/sub)
- [subDays](https://date-fns.org/v2.30.0/docs/subDays)
- ...

### toDate

Date型に変換する。

- [toDate](https://date-fns.org/v2.30.0/docs/toDate)