私はコマンドdate -d "20170712"
が日付を確認して文字列として返すことを理解していますWed Jul 12 00:00:00 PDT 2017
。
私の質問は次のとおりです
日付は私が提供した文字列の形式をどのように理解できますか?(この場合、年は2107、月は7月、日は12です)
また、「20171307」を渡し、日付が13日で月が7月であることを関数に知りたい場合はどうすればよいですか?
date
コマンドに渡される文字列をフォーマットする方法はありますか?
答え1
GNUはdate
入力内容を解析するために最善を尽くしますが、いくつかの形式は本質的にあいまいです。
BSDはdate
入力フォーマットを指定することを許可(または実際に要求)し、その-f
フォーマットに従って入力を解析し、入力がフォーマットと一致しない場合にエラーを発生させます。
それにもかかわらず、あなたのような非論理的でランダムな日付形式をサポートするために標準ツールを期待または要求するのは間違っているようです。標準ツールは標準形式をサポートする必要があり、長期的に見ると、スクリプトとプログラムが内部的にコンピュータフレンドリーな形式を使用するのが合理的であることがわかります。奇妙な行動をしている人間と対話するには、単純なシェルラッパー関数を作成するのは簡単です。
Wackydate () {
local day # local is a Bashism
local mon
local year
year=${1%????}
mon=${1#$year??}
day=${1#$year}
day=${day%$mon}
shift
date -d "$year$mon$day" "$@"
}
シェルの引数は、それぞれ先頭または末尾から削除されたワイルドカード文字に一致する値を置き換えて${variable#prefix}
返します。${variable%suffix}
variable
#
%
答え2
どうぞ、お願いします。
通常、日付出力はLC_TIME
変数によって制御されます。
$ LC_TIME=ja_JP.utf8 date; date'
2017年 7月 13日 木曜日 18:00:22 EDT
Thu Jul 13 18:00:22 EDT 2017
日付文字列の解析は、読者にとって自然で明白に見えるかもしれませんが、非常に難しいかもしれません。
上記の日本語形式と同じです。
それはできるいいえdate コマンドへの入力として使用されます。
あなたはできますロケールファイルの編集必要に応じて設定するか、デフォルト値に設定することもできます。
最初の引用:
Our units of temporal measurement, from seconds on up to months, are so complicated, asymmetrical and disjunctive so as to make coherent mental reckoning in time all but impossible. Indeed, had some tyrannical god contrived to enslave our minds to time, to make it all but impossible for us to escape subjection to sodden routines and unpleasant surprises, he could hardly have done better than handing down our present system. It is like a set of trapezoidal building blocks, with no vertical or horizontal surfaces, like a language in which the simplest thought demands ornate constructions, useless particles and lengthy circumlocutions. Unlike the more successful patterns of language and science, which enable us to face experience boldly or at least level-headedly, our system of temporal calculation silently and persistently encourages our terror of time. ... It is as though architects had to measure length in feet, width in meters and height in ells; as though basic instruction manuals demanded a knowledge of five different languages. It is no wonder then that we often look into our own immediate past or future, last Tuesday or a week from Sunday, with feelings of helpless confusion. ...
——ロバート・グルディン、時間と生活の芸術。
答え:
ほとんど一致するからISO-8601日付形式。
次のように印刷できます。$ date -Id -d 20170713
はい、次のような厄介な形式を使用できます(Busybox日付またはBSD日付を使用)。
$ busybox date -D '%Y%d%m' -d "20171307" Thu Jul 13 00:00:00 EDT 2017
同じ形式で印刷することもできます。
$ busybox date -D '%Y%d%m' -d "20171307" +'%Y%d%m' 20171307
2
はい、上記の例はフォーマットを提供できます。
答え3
date
実際には、使用するバージョンによって異なります。
GNUは、date
入力日がyy[y]*mmdd
(20170713
2017年7月13日)または1000901123
(100090年11月23日、はい、年は将来ですfaaaar ;-))と予想しています。日付を最大10桁まで安定して印刷しますが、後で何が起こるのかわかりません...年は機能しますが、年2140000000
は2150000000
私のシステムでは機能しません。
「携帯できない」などの人間の表現を使用することもできますdate -d 'yesterday'
。
sed
日付をに再編成するために使用されますyyyymmdd
。