3 つのステップでロケールの日付形式をカスタマイズする方法

3 つのステップでロケールの日付形式をカスタマイズする方法

私のシステムでは現在、デフォルトで次のようにdate出力されます:

$ date
Fri 29 Jan 22:04:26 GMT 2016

ただし、この形式の日付を戻そうとすると、date「無効な日付」という結果になります。

$ date -d "$(date)"
date: invalid date ‘Fri 29 Jan 22:06:14 GMT 2016’

次のことを理解できる形式を手動で選択できることに気づきましたdate:

$ date -d "@$(date +%s)"
Fri 29 Jan 22:08:03 GMT 2016

しかし、なぜ受け入れることができない形式を出力するのか興味があります。

答え1

何年もの間私を悩ませてきたこの答えを探すのに約 2 時間費やし、ついに見つけました!!

デフォルトでは、またはなどのdate現在のロケール形式で日付を出力します。en_GB.UTF-8en_AU.UTF-8de_DE.UTF-8

デフォルトのロケールは私のものと似ており、日付は次の形式で表示されます。

date_fmt "%a %e %b %H:%M:%S %Z %Y"

残念ながら、これはdateコマンドが理解できない数少ないフォーマットの1つです。しかし、理解することができます非常に似た形式

date_fmt "%a %e %b %Y %H:%M:%S %Z"

「2016年1月29日金曜日 22:04:26 GMT」が機能する

「2016年1月29日金曜日 22:04:26 GMT」は

非常によく使用されるロケール en_GB.UTF-8 と en_AU.UTF-8 が、なぜdate読み取れない形式を使用するのかはわかりませんが、システムを再インストールするか、過度な更新によって定義が上書きされるまでは、再び問題にならないように調整するのは非常に簡単です >:-(

3 つのステップでロケールの日付形式をカスタマイズする方法

以下の情報を見つけましたここ:

1. 使用しているロケールを確認する

まず、システムが時間と日付の形式に使用しているロケールを確認します。

$ locale
LANG=en_AU.UTF-8
LANGUAGE=en_AU
LC_CTYPE="en_AU.UTF-8"
LC_NUMERIC=en_AU.UTF-8
LC_TIME=en_AU.UTF-8
LC_COLLATE="en_AU.UTF-8"
LC_MONETARY=en_AU.UTF-8
LC_MESSAGES="en_AU.UTF-8"
LC_PAPER=en_AU.UTF-8
LC_NAME=en_AU.UTF-8
LC_ADDRESS=en_AU.UTF-8
LC_TELEPHONE=en_AU.UTF-8
LC_MEASUREMENT=en_AU.UTF-8
LC_IDENTIFICATION=en_AU.UTF-8
LC_ALL=

注意してくださいLC_TIME=エントリー。私のは英語とオーストラリア語です。en_AU.UTF-8あなたのはen_GB_UTF-8かもしれません

2. ロケール定義を編集する

ターミナルを開き、適切なロケール定義を編集します

$ sudo nano /usr/share/i18n/locales/{LC_Time}

例えば

$ sudo nano /usr/share/i18n/locales/en_AU

LC_TIME セクションまでスクロールすると、次のようになります。

LC_TIME
abday       "Sun";"Mon";"Tue";"Wed";"Thu";"Fri";"Sat"
day         "Sunday";/
            "Monday";/
            "Tuesday";/
            "Wednesday";/
            "Thursday";/
            "Friday";/
            "Saturday"
abmon       "Jan";"Feb";/
            "Mar";"Apr";/
            "May";"Jun";/
            "Jul";"Aug";/
            "Sep";"Oct";/
            "Nov";"Dec"
mon         "January";/
            "February";/
            "March";/
            "April";/
            "May";/
            "June";/
            "July";/
            "August";/
            "September";/
            "October";/
            "November";/
            "December"
d_t_fmt     "%a %d %b %Y %T %Z"
d_fmt       "%d//%m//%y"
t_fmt       "%T"
am_pm       "AM";"PM"
t_fmt_ampm  "%I:%M:%S %p"
date_fmt    "%a %e %b %Y %H:%M:%S %Z"
week 7;19971130;1
END LC_TIME

変更する必要があるのはエントリだけdate_fmtです

date_fmt "%a %e %b %H:%M:%S %Z %Y"私は次のように変更しました: date_fmt "%a %e %b %Y %H:%M:%S %Z"

ファイルを保存してエディターを終了します

3 ロケールを再生成する

ロケール定義ファイルを次のように再コンパイルします。

$ sudo locale-gen

これで完了です。これで、dateコマンドはデフォルトで、入力としてネイティブに受け入れることができる形式で出力を行うようになります。

$ date -d "$(date)"
Mon 17 Aug 2020 17:58:37 AWST

関連情報