Date (UNIX)

UNIXのdateとは、日時を表示するコマンドである。スーパーユーザーはこのコマンドを利用してシステム時刻を設定できる。

 利用法 
オプションなしで実行した場合、dateコマンドは現在日時を表示する。より正確には、標準Cライブラリの関数gettimeofday()を用いて秒単位またはマイクロ秒単位でオペレーティングシステム (OS) が保持するシステム時刻を呼び出し、「タイムゾーン情報」（Unix系OSではtz databaseが良く使われる）を用いて設定された標準時（タイムゾーン）に変換して表示する。表示の形式は、月・曜日は省略形となり、日付と月、コロン区切りの時刻、標準時、年の順番で表示される。システム時刻がEDTに設定済みの上でdateコマンドを実行した例を挙げる。

 $date
 Fri Jul 27 14:12:06 EDT 2007

dateコマンドの実装はUnix系のバリエーションによって違いが大きいことには注意しておきたい。移植性がある部分が少なかったためPOSIXでは-uオプションとフォーマット指定子しか標準化することが出来なかった。それ以外はすべて拡張機能であり移植性がない。システム時刻の設定も拡張機能である。GNU Core Utilitiesをベースとするコマンドはより多くの拡張機能が実装されている。

 フォーマット 
dateコマンドに+で始まる以下の文字列をオプションとして与えることで表示形式（フォーマット）を変更することができる。表の通り、dateコマンドの出力結果はロケールによって変化する（混乱しないよう述べると、本稿の表において、出力結果はウィキペディアのシステム時刻であり、それはUTCと一致している。また一部を除いてロケールは「日本」に設定したと仮定している）。

+フォーマット指示子（フォーマット文字列は+から始まる） 指示子 記述 値/例 備考 日 %a 曜日（省略形。例: Sun.）     ロケールによって結果は変わる %A 曜日（完全な表記）    ロケールによって結果は変わる %d 日（ゼロ埋めされたdd表記）    %e 日（ゼロ埋めしないdd表記）    %j その年の経過日数（ゼロ埋め表記）  001-366  %u 月曜日を1日目とした時の1週間における経過日数（mtwtfss）    %w 日曜日を0日目とした時の1週間における経過日数（smtwtfs）    週 %U 日曜日を週の最初の日とみなしたときの、その年での経過週数（0から開始） 00–53  %W 月曜日を週の最初の日とみなしたときの、その年での経過週数（0から開始） 00–53  %V 月曜日を週の最初の日とみなしたときの、その年での経過週数（1から開始） 01–53  月%m 月数（mm表記）  %h 月名   ロケールによって結果は変わる%b 月名（ロケールによっては省略系。例: Jan.）    ロケールによって結果は変わる%B 月名（%b指示子にて省略されたロケールでも、本指示子の場合は完全に表記されるが、可変長である）    ロケールによって結果は変わる 年 %y 2桁年数（yy表記） 00–99  %Y 年数（ccyy表記）   %g 2桁年数（%V指示子の週数に対応する表記）   %G 4桁年数（%V指示子の週数に対応する表記）   世紀 %C 世紀（cc表記） 00–99  日付 %D mm/dd/yy表記  //  %x mm/dd/yy表記（ただし、ロケール固有の表現）  //  %F %Y-%m-%d   --  時 %l (小文字のL) 12時間表記（ゼロ埋めせず）   %I (大文字のI) 12時間表記（ゼロ埋め）   %k 24時間表記（ゼロ埋めせず）   %H 24時間表記（ゼロ埋め）   %p AM/PM表記（ロケールによるが、大文字表記。空白をおいて「時」が表記されることが多い）    %P am/pm表記（ロケールによるが、小文字表記。）    分 %M 分（MM表記）   秒 %s 1970年1月1日0時0分0秒UTCからの秒数（UNIX時間）   %S 秒（SS表記） 00–60（60というのは閏秒による）  %N ナノ秒 000000000–999999999  時刻 %r 時、分、秒（12時間表記）    %R 時、分（24時間表記）   hh:mm、例えば  %T 時、分、秒（24時間表記）    %X %H:%M:%S（ロケール固有の表現）   日時 %c ロケール固有の日時表記 Sat Nov 04 12:02:33 EST 1989   標準時・タイムゾーン %z RFC-822方式の数値表記（-zzzz）  -0500  %Z 英字表記のタイムゾーン。未決ならば空白。  EST 

文字出力: %n 改行       %% パーセント      %t 水平タブ

デフォルトではdateは数値フィールドをゼロ埋めする。

GNU dateは%と数値指定子の間にあるフィールドに対して、-（ハイフン）を置くと空白を埋めずフィールドを詰めないが、 _（アンダースコア）は空白でフィールドを埋める。この動作はBSDベースのdateコマンドには当てはまらない。

環境変数TZはタイムゾーンを指定する。ただしこの値はコマンドラインパラメータで上書きできる。TZに何も指定されていない場合、デフォルトでは/etc/localtimeの設定が利用される（詳細は記事"tz database"を参照）。

 オプション 

-d, -de=stringは、文字列stringに適応する日時を表示する。例えば-d two days agoならばコマンド実行時点から2日前の日時を表示する。ただし、nowは指定できない。

-e=datefileは、deで指定した文字列を記述したdatefileを一行ずつ読み込み処理する。

-s, --set=stringは、-d, -deと同様の形式の文字列stringを受け付け、時刻を設定する設定にはsettimeofday()が利用される。。

-nは、timed(8)ユーティリティを利用したマシンの時刻同期を行わない。デフォルトでは、timedが稼動している場合、dateコマンドはローカル・グループに含まれる全てのマシンの時刻を同一のものに設定する。-nオプションはこれを抑制する。

-uは、UTCに時刻を表示、もしくは設定する。

date [-u|--utc|--universal] [mmddHHMM[[cc]yy][[.SS]]というオプションでのみ、その出力結果はUTCを指定する適切な形式となる。

-uは、GMTに指定されたとみなす。出力結果例: Sat Feb  5 14:49:42 GMT 2005

--utc, --universalはTZを地方時の代わりにUTCに指定されたとみなす。出力結果例: Sat Feb  5 09:49:59 EST 2005

-ITIMESPEC, --iso-8601[=TIMESPEC]は、ISO 8601形式で出力する。TIMESPECには文字列hours, minutes, secondsのいずれかを指定でき、それぞれ時刻の精度を決定する。autoと指定すると時刻を表示しなくなる。

文字列を何も指定せず、ただ--iso-8601というオプションを指定した場合、 `date'コマンドのデフォルトの表示、すなわち、時刻を省略したISO 8601形式で出力する。

-R, --rfc-822は、出力をRFC-822準拠の日時文字列で出力する。例: Wed, 16 Dec 2009 15:18:11 +0100

--helpは、使用方法を表示する。

Single UNIX Specification (SUS)は、たった一つのオプション: -uのみを要求している。前述したとおり、これはタイムゾーンがあたかもUTC+0に指定したかのように日時を表示する。その他のUNIX並びにUnix系オペレーティングシステムでは追加のオプションが提供される場合もある。

 実行例 

 date "+%m/%d/%y"
 7/4/06

 date "+%Y%m%d"
 20060704

時刻に変数を割り当てる場合は、
 START=`date '+%r'`
 echo $START
 03:06:02 PM
 sleep 5
 echo $START
 03:06:02 PM
ただし、変数は時刻を割り当てた瞬間のものである。実行した瞬間ではない。

dateコマンド実行からちょうど昨日の日時を変数に割り当てる場合は、
 DATE=$(date -d yesterday +"%Y%m%d")
 echo $DATE
 20060704

異なるタイムゾーンの時刻を表示したい場合は、環境変数TZの値を上書きする。
様々なタイムゾーンは/usr/share/zoneinfoディレクトリ以下に存在する（詳細は記事"tz database"を参照）。
 OLDTZ=$TZ
 export TZ=GMT; echo "GMT:               `date +\"%F %R (%Z)\"`"
 GMT:               2008-10-31 12:30 (GMT)
 export TZ=Europe/Stockholm; echo "Stockholm:    `date +\"%F %R (%Z)\"`"
 Stockholm:    2008-10-31 13:30 (CET)
 export TZ=Asia/Kuala_Lumpur; echo "Kuala Lumpur:        `date +\"%F %R (%Z)\"`"
 Kuala Lumpur:        2008-10-31 20:30 (MYT)
 export TZ=US/Central; echo "Dallas:             `date +\"%F %R (%Z)\"`"
 Dallas:             2008-10-31 07:30 (CDT)
 export TZ=$OLDTZ

その他の利用可能な時刻文字列の例。
 date +"%Y%m%d" -d sunday # GNU date
 20060709

 date +"%Y%m%d" -d last-sunday # GNU date
 20060702

 date +"%Y%m%d" -d last-week # GNU date
 date -v -1m +"%Y%m%d" # BSD date
 20060627

 date +"%Y%m%d" -d last-month # GNU date
 date -v -1w +"%Y%m%d" # BSD date
 20060604

 date +"%Y%m%d" -d last-year # GNU date
 date -v -1y +"%Y%m%d" # BSD date
 20050704

 date +"%Y%m%d" -d next-week # GNU date
 date -v 1w +"%Y%m%d" # BSD date
 20060711

 date +"%Y%m%d" -d next-month # GNU date
 date -v 1m +"%Y%m%d" # BSD date
 20060804

 date +"%Y%m%d" -d next-year # GNU date
 date -v 1y +"%Y%m%d" # BSD date
 20070704

 date +"%Y%m%d" -d "2 days ago" # GNU date
 date -v -2d +"%Y%m%d" # BSD date
 20060702

 date +"%Y%m%d" -d "2 months ago" # GNU date
 date -v -2m +"%Y%m%d" # BSD date
 20060504

 date +"%Y%m%d" -d "2 years ago" # GNU date
 date -v -2y +"%Y%m%d" # BSD date
 20040704

UNIX時間を表示するには、
 date +"%s" -d "Fri Apr 24 13:14:39 CDT 2009"
 1240596879

UNIX時間から人間が可読な形式に変換するには、
 date -d "UTC 1970-01-01 1240596879 secs"
 Fri Apr 24 13:14:39 CDT 2009
または、
 date -ud @1000000000
 Sun Sep  9 01:46:40 UTC 2001

 システム時刻の設定 
SUSのX/Open System Interfaces（XSI）拡張仕様では、dateコマンドは、日時を設定するためにも利用可能であると指定されている。日時を変更したい場合は、dateと共に、MMddhhmm[[cc]yy]フォーマットのオプションを指定する。ここで、MMとは2桁表示での月数、ddは2桁表示での日数、hhは2桁表示での時間、mmは2桁表示での分を表す。以下は補足的に利用される。ccは年の先頭2桁、yyは年の後半2桁の数字を表す。

その他のUNIXやUnix系オペレーティングシステムでは、dateコマンドのオプションまたは日時フォーマットが異なっている可能性がある。例えば、Linuxなど幾つかのシステムでは、現在日時を2004年9月8日1時22分に設定する場合は、以下のようなコマンドラインで実行する。

 date --set="20040908 01:22"

 脚注 

 注釈 

 出典 

 関連項目 
 adjtimex - Linux環境下でdateとほぼ同じ用途に用いられるコマンド。ただしこちらは直接システムコールadjtimex()でシステム時刻を呼び出す。
  - システム時刻だけではなくリアルタイムクロック（RTC）も操作できるコマンド。システムコールioctl()を使って/dev/rtcにアクセスし、カーネルのRTCデバイスドライバを利用してRTCにアクセスする。このコマンドを用いてシステム時刻をRTCに書き込める、またはその逆、システム時刻をRTCに同期できる。RTCは通常タイムゾーン情報を回路内に保持していない。そのためにRTCのタイムゾーンを定める設定ファイル（/etc/adjtime）が存在する。またシステム時刻のタイムゾーン情報（即ちtz database）の設定ファイルはこれと別に存在する（/etc/localtime）。これらを利用し、RTCとシステム時刻を互いに同期する場合に両者のタイムゾーンに相違が発生しないよう配慮する必要がある。
 UNIXプログラムの一覧
 UNIX時間、すなわち1970年1月1日0時0分0秒 UTCをとした経過秒。

 cronは与えられた日時に稼動するスケジューリング・ジョブを処理するデーモンである。

 外部リンク 


 Manpage of DATE - マニュアルの日本語訳。
 Manpage of date - 同上。

 UNIX dateコマンドの実行例。

Category:UNIXのソフトウェア
Category:コンピュータと時間