[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

27. 日付入力の書式

最初の引用:

我々の時間を計る単位は,秒から月まであり,かなり複雑で,非対称で,連結 できないので,徹頭徹尾,頭の計算で間に合わせることは,ほとんど不可能で す.本当に,非道な神が我々を時間の奴隷にし,我々がぼんやりした繰り返し 仕事と不快な驚きへの従属から逃げることをほぼ不可能にしようと企てたので, 彼は我々の現在のシステムを伝える以上のことを行うことができませんでした. それは,台形の建築用ブロックの集合に似ていて垂直や水平の表面が無く,最 も単純な考えで,建造物を飾り立てることを要求された言語に似ていて役に立 たない微粒子と長い遠回しな表現です.我々がはっきりとした,または,少な くとも頭打ちな経験に直面することを可能にした,より成功した言語と科学の のパターンと異なり,我々の時間を計るシステムは,静かにそして繰り返し, 時間の恐怖を呼び起こします.

… それは,建築家がフィートで長さを,メートルで幅を,そしてellで 高さを計る必要があるかのようなものです.基本的な指示用のマニュアルで, 五つの異なる言語の知識を必要とするかのようなものです.我々が,どうにも ならない混乱した気分で,この間の火曜日や日曜日からの一週間といった,短 い過去あるいは近い将来を調査することがよくあるのは,不思議ではありませ ん. … (4)

-- Robert Grudin, Time and the Art of Living.

このセクションでは,GNUプログラムが受け入れる,文章上での日付の表 現を記述します.これらは,様々なプログラムの引数としてユーザが供給可能 な文字列です.(getdate関数による)Cのインターフェースはここでは 述べません.

ここでの日付の構文は,0年から表現することは可能ですが,コンピュータの 整数は,そのような長い範囲を表現することができないことがよくあります. POSIXシステム上では,時刻は1970-01-01 00:00:00 UTCから 始まります.POSIXは,POSIXエポック時間より前と,遠 い将来の時間のサポートを要求しません.伝統的なUnixシステムは,32ビット の符号付きtime_tがあり,1901-12-13 20:45:52から2038-01-19 03:14:07 UTCまで表現可能です.64ビットの符号付きtime_tを用 いたシステムでは,知られている宇宙の一生の全ての時間を表現可能です.


27.1 一般的な日付の構文

日付(date)は,空白で分けられた多くの項目を含む,空も可能な文字列 です.曖昧にならないとき,空白は省略できます.空の文字列は今日の始まり (すなわち真夜中)を意味します.項目の順序は重要ではありません.日付の文 字列は,項目の多くの特色を含むことができます.

我々は,これらの項目形式のそれぞれを,以下で順番に記述します.

いくつかの数字は,ほとんどの文脈で単語で書き出すことができます.これは 曜日の項目や相対的な項目を指定するとき,最も役に立ちます(以下を参照し てください).以下にリストがあります.1に対する`first',2に対する `next',3に対する`third',4に対する`fourth',5に対する `fifth',6に対する`sixth',7に対する`seventh',8に対す る`eighth',9に対する`ninth',10に対する`tenth',11に対 する`eleventh',そして12に対する`twelfth'です.また `last'は,正確に-1を意味します.

月をこの方法で書くとき,"完全な綴り"の代わりに,それは数字で書かれて いると考えられます.これは文字に変更することもできます.

現在の実装では,`AM',`DST',`EST',`first', `January',`Sunday',`tomorrow',そして`year'のよう な,単語と省略は英語のみサポートされています.

dateの出力は,言語の問題だけでなく,`IST'のようなタイム ゾーン項目に対する標準的な意味がないため,日付文字列として常に受け入れ 可能ではありません.後でパースする目的で日付文字列を生成するために dateを使用するとき,言語に独立して,`UTC'と`Z'以外 のタイムゾーン項目を使用しない日付の書式を指定してください.こうするた めの方法が,以下にいくつかあります.

 
$ LC_ALL=C TZ=UTC0 date
Fri Dec 15 19:48:05 UTC 2000
$ TZ=UTC0 date +"%Y-%m-%d %H:%M:%SZ"
2000-12-15 19:48:05Z
$ date --iso-8601=seconds  # GNUの拡張
2000-12-15T11:48:05-0800
$ date --rfc-2822  # GNUの拡張
Fri, 15 Dec 2000 11:48:05 -0800
$ date +"%Y-%m-%d %H:%M:%S %z"  # %zはGNUの拡張です.
2000-12-15 11:48:05 -0800

アルファベットの大文字小文字は,日付では完全に無視されます.コメントは, 適切に入れ子状になった丸カッコに含まれる限り,丸カッコの間で導入可能です. 数字に続かないハイフンは,現在無視されます.数字の前に前置されるゼロは無 視されます.


27.2 カレンダーの日付の項目

カレンダーの日付の項目(calendar date item)は年の日付を指定します. それは,月が数字で指定されるか,文字で指定されるかによって異なりますこ れら全ての文字列は,同じカレンダーの日付を指定します.

 
72-9-24        # 69から99までは19xxだと仮定され,
               # 00から68までは20xxだと仮定されます.
72-09-24       # 前置されるゼロは無視されます.
9/24/72        # 一般的な U.S. での書き方です.
24 September 1972
24 Sept 72     # 九月には特殊な省略があります.
24 Sep 72      # 三文字の省略は常に可能です.
Sep 24, 1972
24-sep-72
24sep72

年も省略できます.この場合,最後に指定された年,または,無ければ現在の 年が利用されます.例えば,以下のようになります.

 
9/24
sep 24

以下の規則があります.

数字の月に対し,ISO 8601書式 `year-month-day' が可能で,yearは正の数, monthは01と12の間の数,そしてdayは01と31の間の数です.数字 が10未満の場合,ゼロを前置する必要があります.yearが68以下の場合, 2000が加えられます.それ以外の場合で,yearが100未満の場合,1900 が加えられます.合州国でよく使用される `month/day/year'の構成も受け入れられます.同様 に,年を削除すると`month/day'です.

文字の月は完全に綴ることもできます.`January',`February', `March',`April',`May',`June',`July', `August',`September',`October',`November',また は,`December'です.文字の月は最初の三文字で省略でき,省略のドッ トの後置も可能です.`September'の代わりに`Sept'と書くことも 許可されています.

月が文字で書かれるとき,カレンダーの日付は以下のようにして与えられます.

 
day month year
day month
month day year
day-month-year

または,年を省略します.

 
month day

27.3 日付の時間の項目

日付文字列での日付の時間の項目(time of day item)は,与えられた日付 の時間を指定します.以下にいくつか例があり,全て同じ時間を表現しています.

 
20:02:0
20:02
8:02pm
20:02-0500      # EST (合州国東部標準時)

より一般的に,日付の時間は, `hour:minute:second' として与えることができ, hourは0と23の間の数字,minuteは0と59 の間の数字,そして secondは0と59の間の数字です.代わりに,`:second'は省 略でき,その場合,それは0です.

時間に`am'や`pm'(または,`a.m.'や`p.m.')が続く場合, hourは1から12までの実行に限定され,`:minute'は省略で きます(ゼロとされます).`am'は午前を示し,`pm'は午後を示しま す.この注釈で,12は1の前になります.真夜中は`12am'で,一方正午は `12pm'です.(これは,`12am'を正午,`12pm'を真夜中として 使用する,ラテン語に由来する古い伝統の反対となる,`12am'と `12pm' のゼロを起点にした解釈です.)

時刻は,代わりにタイムゾーン補正を続けることができ,それは `shhmm'として表現され,sは`+'または `-',hhは時間の数字,そしてmmは地域の分の数字になりま す.タイムゾーン修正がこのように与えられるとき,それは,世界標準時 (UTC) に関連する時間として解釈され,タイムゾーンや地域的タイムゾー ンに対する,あらゆる前置される指定に優先します.日付の時間の minuteの部分は,タイムゾーン修正が使用されるとき省略できません. これは,時間の分数部分でタイムゾーン修正を指定する唯一の方法です.

`am'/`pm'やタイムゾーン修正は,どちらか一方のみ指定でき,両 方はできません.


27.4 タイムゾーンの項目

タイムゾーンの項目(time zone item)は,国際的なタイムゾーンを指定 し,例えば世界標準時に対する`UTC'や`Z'のような小さな文字集合 で示されます.含まれるピリオドは全て無視されます.別々の(すなわち,い くつかの空白で区切られている)単語内の文字列`DST'が夏時間でないタ イムゾーンに続くことで,対応する夏時間のタイムゾーンが指定可能です.

`UTC'と`Z'以外のタイムゾーンの項目は時代遅れで,曖昧なので推 奨されません.例えば,`EST'はオーストラリアと合州国では異なる意味 を持ちます.代わりに,前のセクションで記述されている,`-0500'のよ うな曖昧でない数字のタイムゾーンコレクションを使用した方が良いでしょう.


27.5 曜日の項目

曜日の明示的な記述は,将来,曜日に到達するよう,(必要なら)日付に前置さ れます.

曜日は,完全に綴ることができます.`Sunday',`Monday', `Tuesday',`Wednesday',`Thursday',`Friday',また は,`Saturday'です.曜日は,最初の三文字で省略でき,追加のピリオ ドを続けることができます.特別な省略として,`Tuesday'に対する `Tues',`Wednesday'に対する`Wednes',そして, `Thursday'に対する`Thur'や`Thurs'も許可されています.

前置された追加分の週を移動するため,数字を曜日項目に前置することができ ます.それは,`third monday'のような表現が最も良い使用法です.こ の文脈では,`last day'や`next day'も受け入れられ ます.それらはdayで表現されている日付の一週間前,または後になり ます.

曜日に続くカンマは無視されます.


27.6 日付文字の相対的な項目

相対的な項目(Relative items)は,日付(それが無い場合は現在の日付) を前後に調整します.相対的な項目の効果は蓄積されます.以下にいくつか例 があります.

 
1 year
1 year ago
3 years
2 days

時間の置換の単位は,年や月全体を移動するため,文字列`year'や `month'が選択できます.年や月は全てが同じ期間ではないので,これら は曖昧な単位です.より正確な単位は,14日と等価な`fortnight',7日 と等価な`week',24時間と等価な`day',60分と等価な`hour', 60秒と等価な`minute'や`min',そして1秒と等価な`second' や`sec'です.これらの単位の`s'接尾子は受け入れられ,無視され ます.

時間の単位は乗数を前置でき,それは追加の符号付きの数字で与えられます. 符号無しの数字は,正の符号として扱われます.全く数字が無いものは,乗数 として1が暗示されます.文字列`ago'が続く相対的な項目は,値 -1の乗数が前置された単位と等価です.

文字列`tomorrow'は,未来の1日と等価で(`day'と等価),文字列 `yesterday'は,過去の1日と等価です(`day ago'と等価).

文字列`now'や`today'は,ゼロ値の時間を置換する相対的な項目で, これらの文字列は,ゼロ値の時間を置換することが前の項目で変化されていな いときの現在時間を表現するという事実に由来します.それらは`12:00 today'のように,他の項目を強調するために使用できます.文字列 `this' もゼロ値の時間を置換する意味を持ちますが,`this thursday'のような日付文字列で好まれます.

相対的な項目が,調整された時刻を跨るために結果として日付が生成されると き,特に夏時間では,結果として生じる日付と時間は,それに応じて調整され ます.

曖昧な単位は相対的な項目では問題になるはずです.例えば, `2003-07-31 -1 month'は,2003-06-31が有効な日付ではないので, 2003-07-01と評価される可能性があります.直前の月の決定をより信頼性のあ るものにするため,現在の月の15日前の月を尋ねることが可能です.例えば以 下のようにします.

 
$ date -R
Thu, 31 Jul 2003 13:02:39 -0700
$ date --date="-1 month" +'Last month was %B?'
Last month was July?
$ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
Last month was June!

同様に,昼間の時刻合わせのような,時刻の変化を用いて日付を操作するとき も注意して下さい.現在の時刻から24時間以上追加または削除する状況があり, 日付計算を開始する前に,TZ環境変数を`UTC0'に設定することで, 標準時に対応しておいたほうがよいでしょう.


27.7 日付文字列の純粋な数字

純粋な十進数の正確な解釈は,日付文字列の文脈に依存します.

十進数が,形式yyyymmddで,他のカレンダーの日付項目 (see section カレンダーの日付の項目)が,その日付項目の前に現われない場合, yyyyは年,mmは月の数字,そしてddは月の日付として,指 定されたカレンダーの日付として読み込まれます.

十進数が形式hhmmで,他の日付の時間の項目がその日付文字列の 前に現われない場合,hhは日付の時間,そしてmmは時間の分とし て,指定された日付の時間として読み込まれます.mmは省略もできます.

カレンダーの日付と日付の時間が,両方とも日付文字列の数字の左に現われ, そして相対的な項目が無い場合,数字は年に優先します.


27.8 getdateの著者

getdateは元々,Chapel HillのNorth Carolina大学にいるときに, Steven M. Bellovin (smb@research.att.com)によって実装されまし た.コードはその後Usenetの2人に捻りを加えられ,Rich $alz (rsalz@bbn.com)とJim Berets (jberets@bbn.com)が, 1990 年8月に完全に点検しました.GNUシステムに対する様々な修正は, David MacKenzie,Jim Meyering他によってなされました.

この章は元々,François Pinard (pinard@iro.umontreal.ca)が `getdate.y'ソースコードから生成し,K. Berry (kb@cs.umb.edu)が編集しました.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on June, 8 2005 using texi2html 1.70.