date (UNIX)
UNIXのdateとは、日時を表示するコマンドである。スーパーユーザーはこのコマンドを利用してシステム時刻を設定できる。
利用法
[編集]オプションなしで実行した場合、dateコマンドは現在日時を表示する。より正確には、標準Cライブラリの関数gettimeofday()を用いて秒単位またはマイクロ秒単位[1]でオペレーティングシステム (OS) が保持するシステム時刻を呼び出し、「タイムゾーン情報」(Unix系OSではtz databaseが良く使われる)を用いて設定された標準時(タイムゾーン)に変換して表示する[2]。表示の形式は、月・曜日は省略形となり、日付と月、コロン区切りの時刻、標準時、年の順番で表示される。システム時刻が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表記) | 21 | |
%e | 日(ゼロ埋めしないdd表記) | 21 | |
%j | その年の経過日数(ゼロ埋め表記) | 001-366 | |
%u | 月曜日を1日目とした時の1週間における経過日数(mtwtfss) | 6 | |
%w | 日曜日を0日目とした時の1週間における経過日数(smtwtfs) | 6 | |
週 | |||
%U | 日曜日を週の最初の日とみなしたときの、その年での経過週数(0から開始) | 00–53 | |
%W | 月曜日を週の最初の日とみなしたときの、その年での経過週数(0から開始) | 00–53 | |
%V | 月曜日を週の最初の日とみなしたときの、その年での経過週数(1から開始) | 01–53 | |
月 | |||
%m | 月数(mm表記) | 12 | |
%h | 月名 | 12月 | ロケールによって結果は変わる |
%b | 月名(ロケールによっては省略系。例: Jan.) | 12月 | ロケールによって結果は変わる |
%B | 月名(%b指示子にて省略されたロケールでも、本指示子の場合は完全に表記されるが、可変長である) | 12月 | ロケールによって結果は変わる |
年 | |||
%y | 2桁年数(yy表記) | 00–99 | |
%Y | 年数(ccyy表記) | 2024 | |
%g | 2桁年数(%V指示子の週数に対応する表記) | ||
%G | 4桁年数(%V指示子の週数に対応する表記) | ||
世紀 | |||
%C | 世紀(cc表記) | 00–99 | |
日付 | |||
%D | mm/dd/yy表記 | 12/21/24 | |
%x | mm/dd/yy表記(ただし、ロケール固有の表現) | 12/21/2024 | |
%F | %Y-%m-%d | 2024-12-21 | |
時 | |||
%l (小文字のL) | 12時間表記(ゼロ埋めせず) | 4 | |
%I (大文字のI) | 12時間表記(ゼロ埋め) | 04 | |
%k | 24時間表記(ゼロ埋めせず) | 16 | |
%H | 24時間表記(ゼロ埋め) | 16 | |
%p | AM/PM表記(ロケールによるが、大文字表記。空白をおいて「時」が表記されることが多い) | PM | |
%P | am/pm表記(ロケールによるが、小文字表記。) | pm | |
分 | |||
%M | 分(MM表記) | 01 | |
秒 | |||
%s | 1970年1月1日0時0分0秒UTCからの秒数(UNIX時間) | 1734796910 | |
%S | 秒(SS表記) | 00–60 (60というのは閏秒による) |
|
%N | ナノ秒 | 000000000–999999999 | |
時刻 | |||
%r | 時、分、秒(12時間表記) | 04:01:50 PM | |
%R | 時、分(24時間表記) | hh:mm、例えば16:01 | |
%T | 時、分、秒(24時間表記) | 16:01:50 | |
%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を受け付け、時刻を設定する[注釈 1]。
-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"
脚注
[編集]注釈
[編集]- ^ 設定にはsettimeofday()が利用される。 “Manpage of GETTIMEOFDAY”. JM Project. linuxjm.sourceforge.jp (2009年3月25日). 2011年8月12日閲覧。
出典
[編集]- ^ “Manpage of GETTIMEOFDAY”. JM Project. linuxjm.sourceforge.jp (2009年3月25日). 2011年8月12日閲覧。
- ^ 大竹龍史 (2008年12月26日). “暗記に頼らずちゃんと理解 実践でも役立つLPICドリル - 第8回 Linux時刻管理の仕組みと設定”. アットマーク・アイティ. jibun.atmarkit.co.jp. 2011年8月12日閲覧。
関連項目
[編集]- adjtimex - Linux環境下でdateとほぼ同じ用途に用いられるコマンド。ただしこちらは直接システムコールadjtimex()でシステム時刻を呼び出す。
- hwclock - システム時刻だけではなくリアルタイムクロック(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をエポックとした経過秒。
- timeとdate
- cronは与えられた日時に稼動するスケジューリング・ジョブを処理するデーモンである。
外部リンク
[編集]date
: write the date and time – The Open Group基本仕様書第7号2018年版「シェル及びユーティリティ」date(1)
: print or set the system date and time – Linux User Commands Manual (en)- Manpage of DATE - マニュアルの日本語訳。
- Manpage of date - 同上。
date(1)
– FreeBSD General Commands Manual Pages (en)- UNIX dateコマンドの実行例。