date コマンドの日付指定頻出パターン

Linux の date コマンドで今日/明日/昨日や月末や月初、翌月曜日などを求める方法を紹介します。

# 基本

## 今

引数を何も指定しないと「今」の時刻が出力されます。

```
$ date
2016年  7月  2日 土曜日 22:31:39 JST
```

## 基準日の指定

基準日は --date オプションで指定します。

```
$ date --date '2016-01-01'
2016年  1月  1日 金曜日 00:00:00 JST
```

## 日付の相対指定

例えば「 7 日前 」のような相対的な指定も可能です。

```
$ date --date '7 days ago'
2016年  6月 25日 土曜日 23:21:31 JST
```

## 基準日からの相対指定

次のように基準日と相対指定を組み合わせることが出来ます。

```
$ date --date '7 days ago 2016-07-07'
2016年  6月 30日 木曜日 00:00:00 JST
```

## 出力フォーマットを指定する

フォーマットの指定は「 +%Y-%m-%d 」のように「 + 」から始まるところがポイントです。

```
$ date '+%Y-%m-%d'
2016-07-02
```

# 日付指定の例

## 翌日

```
$ date '+%Y-%m-%d' --date '1 day'
2016-07-03
$ date '+%Y-%m-%d' --date '1 days'
2016-07-03
$ date '+%Y-%m-%d' --date 'tomorrow'
2016-07-03
```

## 前日

```
$ date '+%Y-%m-%d' --date '1 day ago'
2016-07-01
$ date '+%Y-%m-%d' --date '1 days ago'
2016-07-01
$ date '+%Y-%m-%d' --date 'yesterday'
2016-07-01
```

## N 日後

日付には 0 や負数を指定することも出来ます。

```
$ date '+%Y-%m-%d' --date '3 days'
2016-07-05
$ date '+%Y-%m-%d' --date '2 days'
2016-07-04
$ date '+%Y-%m-%d' --date '1 days'
2016-07-03
$ date '+%Y-%m-%d' --date '0 days'
2016-07-02
$ date '+%Y-%m-%d' --date '-1 days'
2016-07-01
```

## N 日前

```
$ date '+%Y-%m-%d' --date '3 days ago'
2016-06-29
$ date '+%Y-%m-%d' --date '2 days ago'
2016-06-30
$ date '+%Y-%m-%d' --date '1 days ago'
2016-07-01
$ date '+%Y-%m-%d' --date '0 days ago'
2016-07-02
$ date '+%Y-%m-%d' --date '-1 days ago'
2016-07-03
```

## 特定の日を基準とした翌日

基準日の指定と相対指定を組み合わせることで、特定の日を基準とした翌日を求めることが出来ます。

```
$ date '+%Y-%m-%d' --date '1 day 2016-07-01'
2016-07-02
$ date '+%Y-%m-%d' --date '1 days 2016-07-01'
2016-07-02
$ date '+%Y-%m-%d' --date 'tomorrow 2016-07-01'
2016-07-02
```

## 特定の日を基準とした前日

```
$ date '+%Y-%m-%d' --date '1 day ago 2016-07-01'
2016-06-30
$ date '+%Y-%m-%d' --date '1 days ago 2016-07-01'
2016-06-30
$ date '+%Y-%m-%d' --date 'yesterday 2016-07-01'
2016-06-30
```

## 月初（ある月の 1 日）

出力フォーマットを指定するときに、日付部分を「 01 」とします。

```
$ date '+%Y-%m-01' --date '-2 months'
2016-05-01
$ date '+%Y-%m-01' --date '-1 months'
2016-06-01
$ date '+%Y-%m-01'
2016-07-01
$ date '+%Y-%m-01' --date '1 months'
2016-08-01
$ date '+%Y-%m-01' --date '2 months'
2016-09-01
```

## 月末（ある月の最終日）

月末は「月初（ある月の 1 日）」の「 1 日前 」として求めます。

```
$ date '+%Y-%m-%d' --date "1 days ago $(date '+%Y-%m-01' --date '-2 months')"
2016-04-30
$ date '+%Y-%m-%d' --date "1 days ago $(date '+%Y-%m-01' --date '-1 months')"
2016-05-31
$ date '+%Y-%m-%d' --date "1 days ago $(date '+%Y-%m-01')"
2016-06-30
$ date '+%Y-%m-%d' --date "1 days ago $(date '+%Y-%m-01' --date '1 months')"
2016-07-31
$ date '+%Y-%m-%d' --date "1 days ago $(date '+%Y-%m-01' --date '2 months')"
2016-08-31
```

## 今週の N 曜日

```
$ date '+%Y-%m-%d' --date 'sunday'
2016-07-03
$ date '+%Y-%m-%d' --date 'monday'
2016-07-04
$ date '+%Y-%m-%d' --date 'tuesday'
2016-07-05
$ date '+%Y-%m-%d' --date 'wednesday'
2016-07-06
$ date '+%Y-%m-%d' --date 'thursday'
2016-07-07
$ date '+%Y-%m-%d' --date 'friday'
2016-07-08
$ date '+%Y-%m-%d' --date 'saturday'
2016-07-09
```

## 次の N 曜日

「今週の N 曜日」との違いは、今日が日曜日の場合に来週の日曜日の日付となる点です。

```
$ date '+%Y-%m-%d' --date 'next sunday'
2016-07-10
$ date '+%Y-%m-%d' --date 'next monday'
2016-07-04
$ date '+%Y-%m-%d' --date 'next tuesday'
2016-07-05
$ date '+%Y-%m-%d' --date 'next wednesday'
2016-07-06
$ date '+%Y-%m-%d' --date 'next thursday'
2016-07-07
$ date '+%Y-%m-%d' --date 'next friday'
2016-07-08
$ date '+%Y-%m-%d' --date 'next saturday'
2016-07-09
```

## 年末

```
$ date '+%Y-12-31'
2020-12-31
```

## 元旦

```
$ date '+%Y-01-01'
2020-01-01
```

## 次の元旦

```
$ date '+%Y-01-01' --date 'next year'
2021-01-01
```

# 参考情報

 * [GNU Coreutils: Date input formats](http://www.gnu.org/software/coreutils/manual/html_node/Date-input-formats.html)