OSDN Git Service

5912d614859898242cc70f5aade1ded511517e5d
[linuxjm/jm.git] / info / GNU_coreutils / release / parse-datetime-ja.texi
1 @c ===========================================================================
2 @c
3 @c This file was generated with po4a. Translate the source file.
4 @c
5 @c ===========================================================================
6 @c GNU date syntax documentation
7
8 @c Copyright (C) 1994-2006, 2009-2013 Free Software Foundation, Inc.
9
10 @c Permission is granted to copy, distribute and/or modify this document
11 @c under the terms of the GNU Free Documentation License, Version 1.3 or
12 @c any later version published by the Free Software Foundation; with no
13 @c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
14 @c Texts.  A copy of the license is included in the ``GNU Free
15 @c Documentation License'' file as part of this distribution.
16
17 @node Date input formats
18 @chapter 日付入力の書式
19
20 @cindex date input formats
21 @findex parse_datetime
22
23 まず、引用から始める。
24
25 @quotation
26 時間を計るための我々の単位は、秒から月にいたるまで、あまりにも
27 複雑で、一貫性がなく、ばらばらなので、時間について間違わずに暗算
28 をすることなど、ほとんど不可能なほどだ。まったくの話、どこかの
29 横暴な神様が、人間の知能を時間の奴隷にしてやろうと企んだとしても
30 --- 腐った決まりごとや不愉快な不意打ちに隷従せずに済ますことなど、
31 人間にはほとんど不可能にしてやろうと企んだとしても --- 現在我々が
32 使っているシステムをお下げ渡しになる以上のことは、できなかったに
33 違いない。我々の時間計算のシステムは、垂直な面も水平な面もない
34 台形の建築ブロックの集まりのようなものだ。あるいは、ほんの簡単な
35 考えを述べるにも、凝りに凝った構成や、無駄な不変化詞や、長々しい
36 婉曲表現が必要な言語のようなものだ。言語や科学のもっとうまく行って
37 いる思考様式は、我々が経験に果敢に立ち向かうことを、少なくとも
38 冷静に立ち向かうことを可能にしてくれる。ところが、そうしたものとは
39 違って、我々の時間計算のシステムは、密かに、しかも執拗に時間に
40 対する我々の恐怖をかきたてるのである。
41
42 @dots{} それは、建築家が長さをフィートで、幅をメートルで、高さをエルで
43 測らなければならないようなものだ。あるいは、基本的な使用説明書を
44 読むのに、五つの異なった言語の知識が必要なようなものだ。だから、
45 我々が、自分にとってすぐ最近の過去や未来を表す、この前の火曜日
46 (last Tuesday) とか、来週の日曜日 (a week from Sunday) とかいった
47 表現について、それは一体いつを指しているのだろうと考え込んでは、
48 どうしようもない混乱を覚えることがよくあるのも、無理からぬこと
49 なのである。@dots{}
50
51
52 --- Robert Grudin, @cite{Time and the Art of Living}.
53 @end quotation
54
55 この章では、GNU のプログラムが認識する日付表現文字列について説明
56 する。そうした文字列は、ユーザである読者が、様々なプログラムに引数
57 として渡すことのできるものだ。C のインターフェース (@code{parse_datetime}
58 関数で使用する) については、ここでは説明しない。
59
60 @menu
61 * General date syntax::      共通規則。
62 * Calendar date items::      暦日の項目 (19 Dec 1994)。
63 * Time of day items::        時刻の項目 (9:20pm)。
64 * Time zone items::          タイムゾーンの項目 (EST, PDT, UTC, @dots{})。
65 * Combined date and time of day items::  暦日と時刻を組み合わせた項目 
66                                            (1972-09-24T20:02:00,000000-0500)。
67 * Day of week items::        曜日の項目 (Monday, Tuesday)。
68 * Relative items in date strings::  相対表現の項目 
69                                       (next tuesday, 2 years ago)。
70 * Pure numbers in date strings::    純粋な数値 (19931219, 1440)。
71 * Seconds since the Epoch::         紀元からの秒数 (@@1078100502)。
72 * Specifying time zone rules::      タイムゾーン・ルールの指定 
73                                       (TZ="America/New_York", TZ="UTC0")。
74 * Authors of parse_datetime::       parse_datetime の作者 (Bellovin, Eggert, 
75                                       Salz, Berets, et al.)。
76 @end menu
77
78
79 @node General date syntax
80 @section 日付書式の全体
81
82 @cindex general date syntax
83
84 @cindex items in date strings
85 日付 (@dfn{date}) は、空文字列のこともある文字列であり、空白 (whitespace)
86 で区切られた多くの項目を含んでいる。各項目の意味に曖昧さが生じないなら、
87 空白は省略できる。空の文字列は、今日の始まり (すなわち、真夜中) を意味
88 している。項目の順序は重要ではない。日付文字列では、様々な種類の項目を
89 指定することができる。
90
91 @itemize @bullet
92 @item 暦日の項目
93 @item 時刻の項目
94 @item タイムゾーンの項目
95 @item 日付と時刻を組み合わせた項目
96 @item 曜日の項目
97 @item 相対表現の項目
98 @item 純粋な数値
99 @end itemize
100
101 @noindent 個々の項目については、次節以下で順番に説明する。
102
103 @cindex numbers, written-out
104 @cindex ordinal numbers
105 @findex first @r{in date strings}
106 @findex next @r{in date strings}
107 @findex last @r{in date strings}
108 何番目かを示す序数の中には、現れる場所によっては、単語で表現できる
109 ものがいくつかある。これは、曜日や相対的表現の項目を指定するとき、
110 たいへん便利だ (下記参照)。使用頻度のきわめて高い序数を取り上げると、
111 @samp{last} という単語は @math{-1} を表し、@samp{this} は 0 を、@samp{first} と
112 @samp{next} は
113 両方とも 1 を表している。@samp{second} という単語は時間の単位でもあるので、
114 序数の 2 を単語で表現する方法はない。だが、便宜を考えて、@samp{third} は
115 3 を、@samp{fourth} は 4 を、@samp{fifth} は 5 を、@samp{sixth} は 6 を、@samp{seventh}
116
117 7 を、@samp{eighth} は 8 を、@samp{ninth} は 9 を、@samp{tenth} は 10
118 を、@samp{eleventh} は
119 11 を、@samp{twelfth} は 12 を表すことになっている。
120
121 @cindex months, written-out
122 月がこの形で表現されたときも、やはり数値として (訳注: たとえば、今月
123 から何ヶ月後と) 指定されたと見なされるのであって、月の名前の省略なしの
124 表記と解釈されるわけではない (訳注: たとえば、third month を March の
125 別名の完全表記とは考えない)。そのため、March のような月名を使った場合
126 とは、指定できる文字列が違ってくる。
127
128 @cindex language, in dates
129 現在の実装で使用できる単語は、英語の単語とその省略形のみである。
130 すなわち、@samp{AM}, @samp{DST}, @samp{EST}, @samp{first}, @samp{January},
131 @samp{Sunday}, @samp{tomorrow}, @samp{year} などだ。
132
133 @cindex language, in dates
134 @cindex time zone item
135 @command{date} コマンドの出力だからと言って、必ずしも日付文字列として
136 プログラムに渡せるとはかぎらない。言語の問題のせいばかりではない。
137 @samp{IST} のようなタイムゾーン項目には、標準的な意味が存在しないからでも
138 ある。@command{date} を使用して日付文字列を生成し、それに対して後で構文解析
139 を行うつもりなら、日付の書式には、言語が何であるかに依存せず、@samp{UTC} と
140 @samp{Z} 以外のタイムゾーン項目を使用しないものを指定するべきだ。それを行う
141 方法をいくつか挙げておく。
142
143 @example
144 $ LC_ALL=C TZ=UTC0 date
145 Mon Mar  1 00:21:42 UTC 2004
146 $ TZ=UTC0 date +'%Y-%m-%d %H:%M:%SZ'
147 2004-03-01 00:21:42Z
148 $ date --rfc-3339=ns  # --rfc-3339 は GNU の拡張。
149 2004-02-29 16:21:42.692722128-08:00
150 $ date --rfc-2822  # GNU の拡張。
151 Sun, 29 Feb 2004 16:21:42 -0800
152 $ date +'%Y-%m-%d %H:%M:%S %z'  # %z は GNU の拡張。
153 2004-02-29 16:21:42 -0800
154 $ date +'@@%s.%N'  # %s と %N も GNU の拡張。
155 @@1078100502.692722128
156 @end example
157
158 @cindex case, ignored in dates
159 @cindex comments, in dates
160 日付を指定する際、アルファベットの大文字と小文字は全く区別されない。
161 丸カッコで囲めば、コメントを入れることができる。ただし、丸カッコを入れ子
162 にするときは、開きカッコと閉じカッコがきちんと対応していなければならない。
163 数字が後に続かないハイフンは、現在のところ無視される。また、数値の前に
164 付けた 0 も無視される。
165
166 @cindex leap seconds
167 @samp{2005-02-29} のような無効な日付や @samp{24:00} のような無効な時刻は、
168 却下される。閏秒をサポートしていないホストでは、@samp{23:59:60} のような
169 時刻は、たとえ閏秒に正しく対応する値であっても、却下されるのが普通である。
170
171
172 @node Calendar date items
173 @section 暦日の項目
174
175 @cindex calendar date item
176
177 暦日の項目 (@dfn{calendar date item}) では、ある年のある一日を指定する。
178 月を数字で指定するか、文字で指定するかにかによって、日付の指定法が変わって
179 くる。以下に挙げる文字列は、すべて暦の上の同じ日付を指定している。
180
181 @example
182 1972-09-24     # ISO 8601 形式。
183 72-9-24        # 69 から 99 までは、19xx 年と見なし、
184                # 00 から 68 までは、20xx 年と見なす。
185 72-09-24       # 先頭の 0 は無視される。
186 9/24/72        # アメリカでよく使われる表記。
187 24 September 1972
188 24 Sept 72     # September には、4 文字の省略形もある。
189 24 Sep 72      # 3 文字の省略形は、何月に対しても使用できる。
190 Sep 24, 1972
191 24-sep-72
192 24sep72
193 @end example
194
195 年を省略することもできる。その場合は、日付文字列の後方で指定された
196 年が使用される (訳注: たとえば、@code{date -d "5/3 2:00 UTC 2015"} のような
197 場合だろう)。それもない場合は、今年が使われる。例を挙げると、次のような
198 形である。
199
200 @example
201 9/24
202 sep 24
203 @end example
204
205 要するに、ルールはこうだ。
206
207 @cindex ISO 8601 date format
208 @cindex date format, ISO 8601
209 月を数字で表す場合、ISO 8601 の形式、すなわち @samp{@var{year}-@var{month}-@var{day}} が
210 使用できる。ここで @var{year} は任意の正の数であり、@var{month} は 01 から 12
211 までの数、@var{day} は 01 から 31 までの数である。数が 10 未満のときは、
212 0 を前に付けることになる。@var{year} が 68 以下の場合は、@var{year} に2000 が加算
213 される。また、@var{year} が 69 以上、100 未満ならば、1900 が加算される。
214 アメリカ合衆国で一般的な @samp{@var{month}/@var{day}/@var{year}} という書式も使うことが
215 できる。年を省略した @samp{@var{month}/@var{day}} も可能である。
216
217 @cindex month names in date strings
218 @cindex abbreviations for months
219 月の名前を使用する場合は、フルスペルで書いてもよい。すなわち、
220 @samp{January}, @samp{February}, @samp{March}, @samp{April}, @samp{May},
221 @samp{June}, @samp{July},
222 @samp{August}, @samp{September}, @samp{October}, @samp{November},
223 @samp{December} である。月の
224 名前は、最初の 3 文字に省略することができる。その場合、省略の印の
225 ピリオドは、付けても付けなくてもよい。また、@samp{September} の代わりに、
226 @samp{Sept} と書くことも認められている。
227
228 月名を使用する場合、暦の上の日付は、以下のどの形で指定してもよい。
229
230 @example
231 @var{day} @var{month} @var{year}
232 @var{day} @var{month}
233 @var{month} @var{day} @var{year}
234 @var{day}-@var{month}-@var{year}
235 @end example
236
237 年を省略することもできる。
238
239 @example
240 @var{month} @var{day}
241 @end example
242
243
244 @node Time of day items
245 @section 時刻の項目
246
247 @cindex time of day item
248
249 日付文字列中の時刻の項目 (@dfn{time of day item}) では、当日の時刻を指定
250 する。以下に挙げるいくつかの例は、すべて同じ時刻を表している。
251
252 @example
253 20:02:00.000000
254 20:02
255 8:02pm
256 20:02-0500      # EST (U.S. Eastern Standard Time)
257 @end example
258
259 @cindex leap seconds
260 もっと一般的に言うと、時刻は @samp{@var{hour}:@var{minute}:@var{second}} の形で指定できる。
261 @var{hour} は 0 から 23 までの数であり、@var{minute} は 0 から 59 までの数である。
262 @var{second} は 0 から 59 までの数であり、@samp{.} や @samp{,} を後ろに付けて、一桁以上
263 の数字からなる小数を続けてもよい。なお、@samp{:@var{second}} は省略することもでき、
264 その場合は 0 を指定したことになる。閏秒をサポートするホストもまれには
265 あり、そうしたところでは @var{second} に 60 を指定することができる。
266
267 @findex am @r{in date strings}
268 @findex pm @r{in date strings}
269 @findex midnight @r{in date strings}
270 @findex noon @r{in date strings}
271 時刻に @samp{am} や @samp{pm} (または @samp{a.m.} や @samp{p.m.}) が続く場合は、@var{hour}
272
273 1 から 12 までになる。@samp{:@var{minute}} は省略してもよい (0 を指定したものと
274 見なされる)。@samp{am} は一日の前半を示し、@samp{pm} は一日の後半を示す。この
275 表記法では、1 の前が 12 になる。すなわち、真夜中は @samp{12am} であり、正午
276 は @samp{12pm} である。(これは @samp{12am} や @samp{12pm} の 12 を 0 のように見なす解釈
277 であり、正午を @samp{12m}、深夜を @samp{12pm} とするラテン文化から来た従来の習慣
278 とは逆になっている。)
279
280 @cindex time zone correction
281 @cindex minutes, time zone correction by
282 また、時刻にはタイムゾーン補正を続けてもよい。補正は @samp{@var{s}@var{hh}@var{mm}} という
283 形で表現され、@var{s} は @samp{+} または @samp{-} 符号、@var{hh} は時間帯の時間差、@var{mm} は分差の
284 部分である。分差の部分 @var{mm} は指定しないでもよく、その場合は、1 桁ないし
285 2 桁の補正は、時間差の指定と見なされる。なお、@var{hh} と @var{mm} の間をコロンで
286 区切ってもよい。タイムゾーン補正をこの方法で指定した場合、それが、それ
287 までに指定したいかなるタイムゾーンよりも、また、ローカル・タイムゾーン
288 よりも優先され、指定した時刻は、協定世界時 (UTC) よりも補正分進んでいる
289 (あるいは、遅れている) タイムゾーンの時刻であると解釈されることになる。
290 一例を挙げると、@samp{+0530} と @samp{+05:30} は両方とも、UTC より 5.5 時間進んだ
291 タイムゾーンを表している (たとえば、インドである)。これは、タイムゾーン
292 補正を 1 時間以下の部分まで指定する最善の方法である。タイムゾーン補正の
293 最大値は、24 時間である。
294
295 @samp{am}/@samp{pm} とタイムゾーン補正は、どちらか一方のみが指定できる。両方を
296 指定することはできない。
297
298
299 @node Time zone items
300 @section タイムゾーンの項目
301
302 @cindex time zone item
303
304 タイムゾーン項目 (@dfn{time zone item}) では、国際時間帯を指定する。これは
305 数個の文字によって表されるもので、たとえば、協定世界時 (Coordinated
306 Universal Time) なら @samp{UTC} または @samp{Z} である。省略の印のピリオドは、
307 すべて無視される。標準時のタイムゾーン (a non-daylight-saving time
308 zone) の後ろに、文字列 @samp{DST} を独立した単語として (すなわち、空白、
309 タブなどを間に置いて) 続ければ、対応する夏時間のタイムゾーンを指定
310 することができる。ちなみに、標準時のタイムゾーンの後ろに、タイムゾーン
311 補正を続けて、両方の値を加算することもできる。ただし、その指定法は、
312 通常 @samp{UTC} に対してしか行われない。たとえば、@samp{UTC+05:30} は @samp{+05:30} と
313 同じことである。
314
315 @samp{UTC} と @samp{Z} 以外のタイムゾーン項目は、時代遅れになりかかっている
316 ので、使用しない方がよい。理由は解釈が一定しないからであり、たとえば、
317 @samp{EST} はオーストラリアとアメリカ合衆国で違った意味を持っている。タイム
318 ゾーン項目を使用するよりも、前節で述べた @samp{-0500} のような、数値による
319 タイムゾーン補正を使った方が、曖昧さがないので、賢明である。
320
321 タイムゾーン項目とタイムゾーン補正のどちらも指定されていない場合、
322 日付の解釈は、デフォルトのタイムゾーンのルールを用いて行われる (@pxref{Specifying time zone rules})。
323
324
325 @node Combined date and time of day items
326 @section 暦日と時刻を組み合わせた項目
327
328 @cindex combined date and time of day item
329 @cindex ISO 8601 date and time of day format
330 @cindex date and time of day format, ISO 8601
331
332 ISO 8601 の拡張日時書式は、ISO 8601 形式の日付、@samp{T} という区切り文字、
333 ISO 8601 形式の時刻という構成になっている。@samp{T} の代わりにスペースが
334 使われていても、この書式として認識される。
335
336 この書式では、時刻は 24 時間表記を使用するべきである。秒については、
337 コンマまたはピリオドに小数部分を続けることで、小数点以下も指定できる。
338 ISO 8601 で認められている分や時の小数表現には対応していない。たいていの
339 ホストがナノセコンドの精度のタイムスタンプをサポートしている。サポート
340 を超えた精度は、エラーや警告を出さずに単に除去される。
341
342 例をいくつか挙げてみよう。
343
344 @example
345 2012-09-24T20:02:00.052-0500
346 2012-12-31T23:59:59,999999999+1100
347 1970-01-01 00:00Z
348 @end example
349
350 @node Day of week items
351 @section 曜日の項目
352
353 @cindex day of week item
354
355 曜日を明示的に指定すると、未来のその曜日にまで日付を前に進めることに
356 なる (これが行われるのは、その必要があるときだけである)。
357
358 曜日は省略なしに書いてもよい。すなわち、@samp{Sunday}, @samp{Monday}, @samp{Tuesday},
359 @samp{Wednesday}, @samp{Thursday}, @samp{Friday}, @samp{Saturday} である。最初の
360 3 文字に短縮することもでき、その場合、省略の印のピリオドは付けても
361 付けなくてもよい。@samp{Tuesday} には @samp{Tues}、@samp{Wednesday} には @samp{Wednes}、
362 @samp{Thursday} には @samp{Thur} または @samp{Thurs} という特殊な省略形もある。
363
364 @findex next @var{day}
365 @findex last @var{day}
366 曜日項目の前に数値を付けてもよい。週がその分だけ前に進むことになる。
367 これは、@samp{third monday} のような表現で使うのが、一番よい。その伝で、
368 @samp{last @var{day}} や @samp{next @var{day}} という表現も許されている (訳注: @var{day}
369 の部分には
370 Sunday, Monday などの曜日を指定する)。それぞれ、単独の @var{day} が表すことに
371 なる日付より 1 週間前、または 1 週間後の日付になる。
372 @sp 1
373 (訳注: next について上記のことが成り立つのは、@var{day} が今日の曜日の
374 ときだけである。それ以外の場合は、@var{day} と @samp{next @var{day}} は同じになる。)
375
376 曜日項目の後ろにコンマがあっても、無視される。
377 @sp 1
378 (訳注: 確かに @samp{-d "Thu, 2013-03-07"} といった指定では、コンマが無視
379 されるが、@samp{-d "next Thu,"} や @samp{-d "3 Thu,"} といった指定では、``invalid date''
380 と言われ、エラーになる。)
381
382
383 @node Relative items in date strings
384 @section 相対表現の項目
385
386 @cindex relative items in date strings
387 @cindex displacement of dates
388
389 相対表現の項目 (@dfn{Relative items}) は、日付を (指定しない場合は、現在の
390 日付を) 前後に移動させる。また、相対表現の項目の作用は、加算されていく。
391 相対表現の項目とは、次のようなものである。
392
393 @example
394 1 year
395 1 year ago
396 3 years
397 2 days
398 @end example
399
400 @findex year @r{in date strings}
401 @findex month @r{in date strings}
402 @findex fortnight @r{in date strings}
403 @findex week @r{in date strings}
404 @findex day @r{in date strings}
405 @findex hour @r{in date strings}
406 @findex minute @r{in date strings}
407 時間をどれくらい移動するかの単位は、文字列を使って選択する。まる
408 数年、あるいは、まる数ヶ月ずらすのなら、@samp{year} や @samp{month} という文字列
409 を使う。年も月も、曖昧な単位である。すべての年や月が、同じ長さをしている
410 わけではないからだ。もっと厳密な単位としては、@samp{fortnight} (14 日間)、
411 @samp{week} (7 日間)、@samp{day} (24 時間)、@samp{hour} (60 分間)、@samp{minute} または
412 @samp{min} (60 秒間)、@samp{second} または @samp{sec} (1 秒間) がある。こうした単位
413 には、複数語尾の @samp{s} を付けてもよいが、付けても無視される。
414
415 @findex ago @r{in date strings}
416 時間の単位の前に、何倍かを示す乗数を置くことができる。乗数には、
417 @samp{+} または @samp{-} の符号を付けてもよい。符号なしの数値には、@samp{+} の符号が
418 付いているものと見なされる。数値を指定しなければ、乗数に 1 を指定した
419 ことになる。相対表現の項目に @samp{ago} を続けるのは、単位の前にマイナスの
420 乗数を置くのと同じことである。
421
422 @findex day @r{in date strings}
423 @findex tomorrow @r{in date strings}
424 @findex yesterday @r{in date strings}
425 @samp{tomorrow} という文字列は、1 日分未来ということである (@samp{day} と
426 等しい)。@samp{yesterday} は、1 日分過去ということだ (@samp{day ago} と等しい)。
427
428 @findex now @r{in date strings}
429 @findex today @r{in date strings}
430 @findex this @r{in date strings}
431 @samp{now} や @samp{today} という文字列は、値 0 の時間移動に対応する相対表現の
432 項目である。値 0 の時間移動は、先行する項目によって別の日時に変更されて
433 いないかぎり、今現在の日時を表すということから、@samp{now} (今) や @samp{today}
434 (今日) という言い方ができるわけだ。こうしたものは、他の項目を強調する
435 ために、たとえば、@samp{12:00 today} といった具合に使うこともできる。
436 @samp{this} という文字列にも、値 0 の時間移動という意味があるが、こちらは
437 @samp{this thursday} のような日付文字列で使用される。
438
439 相対表現の項目によって生成される日付が、標準時と夏時間の切り替えを
440 典型とするような、時刻調整の境目を越えたものになる場合、生成される日時
441 は適切に調整される。
442
443 単位の曖昧さが、相対表現の項目では問題を起こすことがある。たとえば、
444 @samp{2003-07-31 -1 month} は、2003-07-01 と評価されるかもしれない。
445 2003-06-31 が無効な日付だからだ。先月が何月かをもっと確実に引き出す
446 ためには、今月の 15 日よりも前に、先行する月を求めればよい。例を挙げる。
447
448 @example
449 $ date -R
450 Thu, 31 Jul 2003 13:02:39 -0700
451 $ date --date='-1 month' +'Last month was %B?'
452 Last month was July?
453 $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
454 Last month was June!
455 @end example
456
457 なお、標準時と夏時間の切り替えのような時刻変更があるときの前後で
458 日付の操作を行う場合には、注意した方がよい。24 時間も加算されたり、
459 減算されたりしてしまうことも、ないとは言えないからだ。そこで、
460 たいていの場合、日付の計算に取りかかる前に、環境変数 @env{TZ} を @samp{UTC0}
461 に設定して、協定世界時を採用するのが賢明である。
462
463 @node Pure numbers in date strings
464 @section 日付文字列中の純粋な数値
465
466 @cindex pure numbers in date strings
467
468 純粋な 10 進数をどう解釈するかは、日付文字列の文脈次第である。
469
470 10 進数が @var{yyyy}@var{mm}@var{dd} の形をとり、日付文字列中のそれより前に他の暦日の
471 項目 (@pxref{Calendar date items}) が存在しない場合は、@var{yyyy} は暦の上の
472 ある 1 日の年の部分と見なされる。@var{mm} は何番目の月かということ、@var{dd} は
473 その月の日にちである。
474
475 10 進数が @var{hh}@var{mm} の形をとり、日付文字列中のそれより前に他の時刻の
476 項目が存在しない場合は、@var{hh} はある 1 日の時刻の何時の部分と、@var{mm} は
477 何分の部分と見なされる。@var{mm} を省略してもよい。
478
479 日付文字列中で、ある数値の左側に暦の上の日にちとその日の時刻の両方が
480 存在し、相対表現の項目が存在しない場合は、その数値が今年の代わりに
481 使われる。
482 @sp 1
483 (訳注: たとえば、@code{date -d "3/27 10:10 2012"} と指定すると、今年の
484 代わりに 2012 が使われるということらしい。@code{date -d "3/27/2001 10:10 2012"}
485 や @code{date -d "2001-03-27 10:10 2012"} は無効な日付になるし、
486 @code{date -d "3/27 1010 2012"} は、1010 年 3 月 27 日 20:12:00 になる。)
487
488
489 @node Seconds since the Epoch
490 @section Unix 紀元 (the Epoch) からの秒数
491
492 @samp{@@} に数値を続けると、それは、秒数として、システム内部で使われるタイム
493 スタンプを表すことになる。数値には、小数点 (@samp{.} または @samp{,}) が含まれて
494 いてもよい。内部表現がサポートしていない余分な精度は、マイナスの無限に
495 向けて切り詰められる。@samp{@@} で始まるこうした数値は、他の日付項目のいかなる
496 ものとも組み合わせて使うことができない。欠けるところのない完全なタイム
497 スタンプの指定だからである。
498
499 @cindex beginning of time, for POSIX
500 @cindex epoch, for POSIX
501 コンピュータの内部では、時間は、ある紀元 (an epoch) --- きちんと定義
502 された時間中のある一点 --- からの秒数として表現されている。GNU や POSIX
503 のシステムでは、紀元は 1970-01-01 00:00:00 UTC である。従って、@samp{@@0} は
504 その時刻を表し、@samp{@@1} は 1970-01-01 00:00:01 UTC を表す、以下同様と
505 いうことになる。GNU を始め、POSIX に準拠したほとんどのシステムでは、
506 POSIX に対する拡張として、こうした時間表記をマイナスの秒数を使うことも
507 含めて、サポートしている。従って、@samp{@@-1} は 1969-12-31 23:59:59 UTC を
508 表すことになる。
509
510 旧来の Unix システムでは、秒を 32 ビットの 2 の補数である整数で
511 数えており、1901-12-13 20:45:52 から 2038-01-19 03:14:07 UTC まで
512 表すことができる。もっと新しいシステムでは、64 ビットの秒数計算を、
513 ナノセコンドのサブカウント付きで使用しており、宇宙の寿命として
514 知られている時間のうちのあらゆる時刻を 1 ナノセコンドの精密さで表す
515 ことができる。
516
517 @cindex leap seconds
518 ほとんどのホストのこうした計算では、閏秒の存在が無視されている。
519 たとえば、ほとんどのホストで @samp{@@915148799} は 1998-12-31 23:59:59 UTC を
520 表し、@samp{@@915148800} は 1999-01-01 00:00:00 UTC を表している。従って、
521 間にある 1998-12-31 23:59:60 UTC という閏秒を表現する方法は存在しない。
522
523 @node Specifying time zone rules
524 @section タイムゾーン・ルールの指定
525
526 @vindex TZ
527 通常、日付の解釈は、現在のタイムゾーンのルールを使って行われる。そして、
528 その現在のタイムゾーンのルールを指定しているのは、環境変数 @env{TZ} か、
529 @env{TZ} が設定されていなければ、システムのデフォルト設定である。今、
530 ある一つの日付のみに別のタイムゾーンでデフォルトとして使われる一連の
531 ルールを適用したいとしよう。その場合は、日付を @samp{TZ="@var{rule}"} という文字列
532 で始めればよい。日付中では、対になった二重引用符 (@samp{"}) で @var{rule} を必ず
533 囲わなければならない。また、@var{rule} 中に引用符やバックスラッシュが
534 あるときは、それをバックスラッシュでエスケープしなければならない。
535
536 一例を挙げると、GNU の @command{date} コマンドを使って、「パリで
537 2004 年 10
538 月 31 日 午前 6 時 30 分のとき、ニューヨークでは何時か?」という質問に
539 答えることができる、以下で示すように、@samp{TZ="Europe/Paris"}で始まる
540 日付を使うのである。
541
542 @example
543 $ export TZ="America/New_York"
544 $ date --date='TZ="Europe/Paris" 2004-10-31 06:30'
545 Sun Oct 31 01:30:00 EDT 2004
546 @end example
547
548 この例では、@option{--date} のオペランドの最初の部分で、それ自身の @env{TZ} が
549 設定されている。そこで、このオペランドの残りの部分は、@samp{Europe/Paris} の
550 ルールに従って処理され、@samp{2004-10-31 06:30} という文字列が、パリの日時で
551 あるかのように扱われる。ところが、@command{date} コマンドの出力は、全体のタイム
552 ゾーンのルールに従って処理されるので、出力にはニューヨークの時刻が使用
553 されるのである。(2004 年には、パリは通常ニューヨークより 6 時間進んで
554 いた。しかし、この例は、時差が 5 時間だったハロウィーンの日のほんの短い
555 間のことを言っている。)
556
557 @env{TZ} の値はルールであり、ルールには通常、@samp{tz} データベースの地域名が
558 付けられている (@uref{http://www.twinsun.com/tz/tz-link.htm})。地域名の最新の
559 一覧は、TWiki Date and Time Gateway で見ることができる
560 (@uref{http://twiki.org/cgi-bin/xtra/tzdate})。なお、GNU 以外のホストの中
561 には、@env{TZ} を設定するとき、@samp{TZ=":America/New_York"} のように、地域名の
562 前にコロンを置く必要があるものもある。
563
564 @samp{tz} データベースには、@samp{Arctic/Longyearbyen} から @samp{Antarctica/South
565 _Pole} に至るまで、実にさまざまな地域が含まれている。それでも、目下
566 航海の最中でタイムゾーンが船特有のものである場合や、@samp{tz} データベースに
567 対応していない non-GNU のホストを使用している場合は、@samp{tz} データベース
568 の地域名で表されるルールの代わりに、POSIX 式のルールを使う必要がある
569 かもしれない。@samp{UTC0} のような POSIX 式の単純なルールだと、夏時間なしの
570 タイムゾーン指定になるが、簡単な夏時間制度なら指定できる他のルールも
571 存在する。 @xref{TZ Variable,, Specifying the Time Zone with @code{TZ}, libc,
572 The GNU C Library}.
573
574 @node Authors of parse_datetime
575 @section @code{parse_datetime} の作者
576 @c the anchor keeps the old node name, to try to avoid breaking links
577 @anchor{Authors of get_date}
578
579 @cindex authors of @code{parse_datetime}
580
581 @cindex Bellovin, Steven M.
582 @cindex Salz, Rich
583 @cindex Berets, Jim
584 @cindex MacKenzie, David
585 @cindex Meyering, Jim
586 @cindex Eggert, Paul
587 @code{parse_datetime} は、@code{getdate} として誕生した。最初の実装を行ったのは、
588 Steven M. Bellovin (@email{smb@@research.att.com}) であり、ノースカロライナ大学
589 チャペルヒル校に在学中のことだった。その後、Usenet 上で数人によって
590 機能が追加され、1990 年 8 月に Rich $alz (@email{rsalz@@bbn.com}) と Jim Berets
591 (@email{jberets@@bbn.com}) によって徹底的なオーバーホールがなされた。GNU シス
592 テムのための様々な改訂は、David MacKenzie, Jim Meyering, Paul Eggert
593 などによって行われた。ほぼ同様の機能を持つ Posix の @code{getdate} 関数との
594 衝突を避けるために @code{get_date} と名前を変えたのも、この改訂の一部であり、
595 さらに後に、@code{parse_datetime} と改名した。Posix の @code{getdate} 関数は、
596 @code{strptime} の使用によりロケール特有の日付の解析に優れているが、環境変数
597 や外部のファイルに依存しており、@code{parse_datetime} の持つスレッド安全性
598 (thread-safety) を欠いている。
599
600 @cindex Pinard, F.
601 @cindex Berry, K.
602 この章は、Fran@,{c}ois Pinard (@email{pinard@@iro.umontreal.ca}) がソースコード
603 の @file{parse_datetime.y} を元にして最初に作成し、その後、K. Berry
604 (@email{kb@@cs.umb.edu}) が増補改訂した。