Mac の date コマンド

Linux や Mac ターミナルでよく使うコマンドに date があります。
Mac の場合は BSD ベースの OS のため、 Linux とはオプションなどが若干異なります。
調べてみるといろいろと使えて面白いコマンドなので、オプションや日時の書式など詳しく見ていこうと思います。

## オプション

<dl>
  <dt>-u</dt>
  <dd>UTC (協定世界時)で表示します。
　　　　</dd>
</dl>

```
% date -u
2023年 5月29日 月曜日 13時08分35秒 UTC
```

<dl>
  <dt>-I</dt>
  <dd>ISO 8601 フォーマットでの出力ができます。単純に -I だけだと日付まで。
hours minutes seconds を付けるとそれぞれ、時・分・秒まで出力します。
　　　　</dd>
</dl>

```
% date -Ihours
2023-05-29T21+09:00
% date -Iminutes
2023-05-29T21:54+09:00
% date -Iseconds
2023-05-29T21:54:07+09:00
```

<dl>
  <dt>-R</dt>
  <dd>RFC 2822 に沿ったフォーマットで出力します。<br>
LC_TIME=C date +"%a, %d %b %Y %T %z"<br>
と同じ結果になります。
　　　　</dd>
</dl>

```
% date -R
Mon, 29 May 2023 22:02:20 +0900
% LC_TIME=C date +"%a, %d %b %Y %T %z"
Mon, 29 May 2023 22:02:21 +0900
```

<dl>
  <dt>-r ファイル名</dt>
  <dd>指定したファイルのタイムスタンプを表示します。</dd>
</dl>

```
% touch test.txt
% date -r test.txt
2023年 5月29日 月曜日 22時03分47秒 JST
```

<dl>
  <dt>-r 秒数</dt>
  <dd>UNIX TIME (1970年1月1日 0時0分0秒からの経過秒数)を指定してその日時を表示します。</dd>
</dl>

```
% date -r 1000000000
2001年 9月 9日 日曜日 10時46分40秒 JST
```

<dl>
  <dt>-j</dt>
  <dd>指定した日付を出力するオプション。指定した日付の曜日を確認するのに使えます。<br>
デフォルトでは [[[mm]dd]HH]MM[[cc]yy][.SS] の書式で指定します。</dd>
</dl>

```
% date -j 070600002024
2024年 7月 6日 土曜日 00時00分00秒 JST
```

<dl>
  <dt>-f</dt>
  <dd>入力の日時書式を指定します。 -j オプションなどと組み合わせて利用します。</dd>
</dl>

```
% date -j -f "%m%d" 0706
2023年 7月 6日 木曜日 22時22分30秒 JST
```


<dl>
  <dt>-v [+|-]数値[y|m|w|d|H|M|S]</dt>
  <dd>数値と単位を指定して、日時の加減算を行います。次節で詳しく。</dd>
</dl>

```
% date -v+2y
2025年 5月29日 木曜日 22時29分35秒 JST
```

## 日時の加減算

前述の -v オプションを使うとさまざまな日時の計算が行えます。
単位となっている英字はそれぞれ以下のように対応しています。

y:年, m:月, w:週間, d:日, H:時, M:分, S:秒

数値の前に + または - を付けると、その数値単位分だけ加算または減算されます。
-v オプションを重ねることで異なる単位の加減算が追加できます。

```2年後の3日前
% date
2023年 5月29日 月曜日 22時42分58秒 JST
% date -v+2y -v-3d
2025年 5月26日 月曜日 22時42分59秒 JST
```

+,- の記号がつかない場合はその単位の日時部分にその数値が設定されます。


```
% date -v4m -v8d -v15H -v30M -v0S
2023年 4月 8日 土曜日 15時30分00秒 JST
```

-j オプションと組み合わせて指定した日時からの加減算ができます。

```
% date -v+3w -j -f "%m%d%H%M%S" 0706153000
2023年 7月27日 木曜日 15時30分00秒 JST
```

## 日時の書式

日時の出力書式は以下のように + で始まるフォーマットで記述します。
なお ```%-d``` のように、英文字の前に - が付く場合は、0 で埋めることはしません。
```%_d``` のように - (マイナス)の代わりに _ (アンダースコア)の場合は、スペースで埋めます。

<table>
  <caption>date コマンドの日時書式</caption>
  <thead>
    <tr>
      <th>単位</th>　<th>記号</th> <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td>世紀</td> <td>%C</td> <td>世紀 (西暦の上2桁)</td>
  </tr>
  <tr>
    <td rowspan=4>年</td> <td>%Y</td> <td>西暦年4桁</td>
  </tr>
  <tr>
    <td>%y</td> <td>西暦年2桁 (00 - 99)</td>
  </tr>
  <tr>
    <td>%G</td> <td>ISO 週番号の年部分 (%V 参照) 通常は %V と同時に使用される</td>
  </tr>
  <tr>
    <td>%g</td> <td>ISO 週番号の最後の2桁 (%G 参照)</td>
  </tr>
  <tr>
    <td rowspan=4>月</td> <td>%m</td> <td>月 (00 - 12)</td>
  </tr>
  <tr>
    <td>%B</td> <td>月名 (January - December)</td>
  </tr>
  <tr>
    <td>%b</td> <td>月の省略名 (Jan - Dec)</td>
  </tr>
  <tr>
    <td>%h</td> <td>%b に同じ</td>
  </tr>  <tr>
    <td rowspan=3>週</td> <td>%U</td> <td>日曜日を週初めとした週番号 (00 - 53)</td>
  </tr>
  <tr>
    <td>%V</td> <td>ISO 週番号。月曜日を週初めとする (01 - 53)</td>
  </tr>
  <tr>
    <td>%W</td> <td>月曜日を週初めとした週番号 (00 - 53)</td>
  </tr>
  <tr>
    <td rowspan=4>曜</td> <td>%A</td> <td>曜日名 (Sunday - Saturday, 日曜日 - 土曜日)</td>
  </tr>
  <tr>
    <td>%a</td> <td>曜日の省略名 (Sun - Sat, 日 - 土)</td>
  </tr>
  <tr>
    <td>%u</td> <td>曜日 (1 - 7、 1が月曜日)</td>
  </tr>
  <tr>
    <td>%w</td> <td>曜日 (0 - 6、 0が日曜日)</td>
  </tr>
  <tr>
    <td rowspan=3>日</td> <td>%d</td> <td>日 (01 - 31)</td>
  </tr>
  <tr>
    <td>%e</td> <td>日 (1 - 31) %_d に同じ</td>
  </tr>
  <tr>
    <td>%j</td> <td>年の開始日からの日数 (001 - 366、1月1日が 001)</td>
  </tr>
  <tr>
    <td>午前/午後</td> <td>%p</td> <td>AM, PM</td>
  </tr>
  <tr>
    <td rowspan=4>時</td> <td>%H</td> <td>時 (24時間形式 00 - 23)</td>
  </tr>
  <tr>
     <td>%I</td> <td>時 (12時間形式 01 - 12)</td>
  </tr>
  <tr>
     <td>%k</td> <td>時 (24時間形式 0 - 23) %_H に同じ</td>
  </tr>
  <tr>
     <td>%l</td> <td>時 (12時間形式 1 - 12) %_I に同じ</td>
  </tr>
  <tr>
    <td>分</td> <td>%M</td> <td>分 (00 - 59)</td>
  </tr>
  <tr>
    <td rowspan=2>秒</td> <td>%S</td> <td>秒 (00 - 60)</td>
  </tr>
  <tr>
    <td>%s</td> <td>UNIXTIME (1970-01-01 00:00:00からの経過秒数)</td>
  </tr>
  <tr>
    <td rowspan=2>タイムゾーン</td> <td>%z</td> <td>+hhmm 形式でのタイムゾーン (例: +0900)</td>
  </tr>
  <tr>
    <td>%Z</td> <td>英字でのタイムゾーン省略形 (例: JST)</td>
  </tr>
  <tr>
    <td rowspan=3>特殊文字</td> <td>%n</td> <td>改行</td>
  </tr>
  <tr>
    <td>%t</td> <td>水平タブ</td>
  </tr>
  <tr>
    <td>%%</td> <td>%</td>
  </tr>
  <tr>
    <td rowspan=8>組み合わせ</td> <td>%c</td> <td>ロケール表示での日付と時刻 (例: Thu Mar 3 23:05:25 2005)</td>
  </tr>
  <tr>
    <td>%D</td> <td>日付 %m/%d/%y に同じ　(例: 05/30/23)</td>
  </tr>
  <tr>
    <td>%F</td> <td>完全形式の日付 %Y-%m-%d に同じ　(例: 2023-05-30)</td>
  </tr>
  <tr>
    <td>%r</td> <td>ロケール表示の12時間表示での時刻 (例: 10:46:14 PM)</td>
  </tr>
  <tr>
    <td>%R</td> <td>24時間表示での時分 (例: 22:46)　%H:%M　に同じ</td>
  </tr>
  <tr>
    <td>%T</td> <td>時刻 (例: 22:46:08)　%H:%M:%S　に同じ</td>
  </tr>
  <tr>
    <td>%x</td> <td>ロケール表示での日付 (例: 2023/05/30)</td>
  </tr>
  <tr>
    <td>%X</td> <td>ロケール表示での時刻 (例: 22時50分27秒)</td>
  </tr>
</table>

# タイムゾーン

date コマンドの前に TZ 環境変数を指定して実行することで、指定したタイムゾーンでの日時を表示することができます。
指定するタイムゾーンは ```/usr/share/zoneinfo/``` 配下にあるファイル名で指定できます。

```
% TZ=EST date
2023年 5月31日 水曜日 01時55分52秒 EST

% TZ=Hongkong date
2023年 5月31日 水曜日 14時55分53秒 HKT

% TZ=Australia/Melbourne date
2023年 5月31日 水曜日 16時55分54秒 AEST
```

# ロケール

また、date コマンドの前に LC_TIME 環境変数にロケールを指定して実行することで、指定した言語で日時を表示することができます。
指定するロケールは ```/usr/share/locale/ ```配下にあるファイル名から指定します。

```
% LC_TIME=en_US.UTF-8 date
Wed May 31 16:19:26 JST 2023

% LC_TIME=en_CA.UTF-8 date
Wed 31 May 2023 16:19:15 JST

% LC_TIME=zh_CN.UTF-8 date
2023年 5月31日 星期三 16时17分34秒 JST

% LC_TIME=ko_KR.UTF-8 date
2023년 5월 31일 수요일 16시 18분 23초 JST
```

かように date コマンドはさまざまな表示が可能です。
今回調べてみてその幅の広さに驚嘆しました。