Date (UNIX)
UNIXの<tt>date</tt>とは、日時を表示するコマンドである。スーパーユーザーはこのコマンドを利用してシステム時刻を設定できる。
オプションなしで実行した場合、dateコマンドは現在日時を表示する。より正確には、標準Cライブラリの関数<tt>gettimeofday()</tt>を用いて秒単位またはマイクロ秒単位でオペレーティングシステム (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と一致している。また一部を除いてロケールは「日本」に設定したと仮定している)。
文字出力: %n 改行       %% パーセント      %t 水平タブ
デフォルトでは<tt>date</tt>は数値フィールドをゼロ埋めする。
GNU dateは%と数値指定子の間にあるフィールドに対して、-(ハイフン)を置くと空白を埋めずフィールドを詰めないが、 _(アンダースコア)は空白でフィールドを埋める。この動作はBSDベースのdateコマンドには当てはまらない。
環境変数<tt>TZ</tt>はタイムゾーンを指定する。ただしこの値はコマンドラインパラメータで上書きできる。TZに何も指定されていない場合、デフォルトでは<tt>/etc/localtime</tt>の設定が利用される(詳細は記事"tz database"を参照)。
-d, -de=stringは、文字列stringに適応する日時を表示する。例えば-d two days agoならばコマンド実行時点から2日前の日時を表示する。ただし、nowは指定できない。
-e=datefileは、deで指定した文字列を記述したdatefileを一行ずつ読み込み処理する。
-s, --set=stringは、-d, -deと同様の形式の文字列stringを受け付け、時刻を設定する。
-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)は、たった一つのオプション: <tt>-u</tt>のみを要求している。前述したとおり、これはタイムゾーンがあたかもUTC+0に指定したかのように日時を表示する。その他のUNIX並びにUnix系オペレーティングシステムでは追加のオプションが提供される場合もある。
date "+%m/%d/%y"
7/4/06
date "+%Y%m%d"
時刻に変数を割り当てる場合は、
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
異なるタイムゾーンの時刻を表示したい場合は、環境変数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
date +"%Y%m%d" -d last-sunday # GNU date
date +"%Y%m%d" -d last-week # GNU date
date -v -1m +"%Y%m%d" # BSD date
date +"%Y%m%d" -d last-month # GNU date
date -v -1w +"%Y%m%d" # BSD date
date +"%Y%m%d" -d last-year # GNU date
date -v -1y +"%Y%m%d" # BSD date
date +"%Y%m%d" -d next-week # GNU date
date -v 1w +"%Y%m%d" # BSD date
date +"%Y%m%d" -d next-month # GNU date
date -v 1m +"%Y%m%d" # BSD date
date +"%Y%m%d" -d next-year # GNU date
date -v 1y +"%Y%m%d" # BSD date
date +"%Y%m%d" -d "2 days ago" # GNU date
date -v -2d +"%Y%m%d" # BSD date
date +"%Y%m%d" -d "2 months ago" # GNU date
date -v -2m +"%Y%m%d" # BSD date
date +"%Y%m%d" -d "2 years ago" # GNU date
date -v -2y +"%Y%m%d" # BSD date
UNIX時間を表示するには、
date +"%s" -d "Fri Apr 24 13:14:39 CDT 2009"
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)拡張仕様では、<tt>date</tt>コマンドは、日時を設定するためにも利用可能であると指定されている。日時を変更したい場合は、<tt>date</tt>と共に、<tt>MMddhhmm[cc]yy]</tt>フォーマットのオプションを指定する。ここで、<tt>MM</tt>とは2桁表示での月数、<tt>dd</tt>は2桁表示での日数、<tt>hh</tt>は2桁表示での時間、<tt>mm</tt>は2桁表示での分を表す。以下は補足的に利用される。<tt>cc</tt>は年の先頭2桁、<tt>yy</tt>は年の後半2桁の数字を表す。
その他のUNIXやUnix系オペレーティングシステムでは、<tt>date</tt>コマンドのオプションまたは日時フォーマットが異なっている可能性がある。例えば、Linuxなど幾つかのシステムでは、現在日時を2004年9月8日1時22分に設定する場合は、以下のようなコマンドラインで実行する。
date --set="20040908 01:22"