Auf meinem System werden derzeit standardmäßig folgende date
Ausgaben angezeigt:
$ date
Fri 29 Jan 22:04:26 GMT 2016
Wenn ich jedoch versuche, Daten in diesem Format wieder einzugeben, date
wird „ungültiges Datum“ angezeigt:
$ date -d "$(date)"
date: invalid date ‘Fri 29 Jan 22:06:14 GMT 2016’
Mir ist klar, dass ich manuell ein Format auswählen kann, das date
Folgendes versteht:
$ date -d "@$(date +%s)"
Fri 29 Jan 22:08:03 GMT 2016
Mich interessiert aber, warum es ein Format ausgibt, das es nicht wieder akzeptiert.
Antwort1
Ich habe gerade etwa zwei Stunden damit verbracht, nach dieser Antwort zu suchen, die mich seit Jahren nervt, und ich habe sie endlich gefunden!!
Standardmäßig date
wird ein Datum im aktuellen Gebietsschemaformat ausgegeben, z. B. en_GB.UTF-8
oder en_AU.UTF-8
oder de_DE.UTF-8
usw.
Ihr Standardgebietsschema ähnelt meinem und zeigt Datumsangaben im folgenden Format an:
date_fmt "%a %e %b %H:%M:%S %Z %Y"
Leider ist dies eines der wenigen Formate, die der Datumsbefehl nicht versteht. Wenn jedochKann verstehenein sehr ähnliches Format
date_fmt "%a %e %b %Y %H:%M:%S %Z"
"Fr 29 Jan 2016 22:04:26 GMT" Funktioniert
"Fri 29 Jan 22:04:26 GMT 2016" Nicht
Warum die sehr häufig verwendeten Gebietsschemas en_GB.UTF-8 und en_AU.UTF-8 ein Format verwenden, das date
nicht gelesen werden kann, weiß ich nicht, aber es ist sehr einfach, es so zu optimieren, dass es Sie nicht mehr stört, zumindest nicht, bis Sie Ihr System neu installieren oder Ihre Definitionen durch ein übereifriges Update überschrieben werden >:-(
So passen Sie das Datumsformat Ihrer Region in drei Schritten an
Ich habe die folgenden Informationen gefundenHier:
1. Überprüfen Sie, welches Gebietsschema Sie verwenden
Überprüfen Sie zunächst, welches Gebietsschema Ihr System für das Zeit- und Datumsformat verwendet
$ 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=
Beachten Sie dasLC_TIME=Eintrag. Meiner ist Englisch-Australisch:en_AU.UTF-8Ihre könnte en_GB_UTF-8 sein
2. Bearbeiten Sie die Gebietsschemadefinition
Öffnen Sie ein Terminal und bearbeiten Sie die entsprechende Gebietsschemadefinition
$ sudo nano /usr/share/i18n/locales/{LC_Time}
z.B
$ sudo nano /usr/share/i18n/locales/en_AU
Scrollen Sie nach unten zum Abschnitt LC_TIME, hier ist meiner:
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
Sie müssen lediglich den Eintrag ändern
Ich habe meins geändert von:
date_fmt "%a %e %b %H:%M:%S %Z %Y"
indate_fmt "%a %e %b %Y %H:%M:%S %Z"
Speichern Sie die Datei und beenden Sie den Editor
3 Regenerieren Sie Ihr Gebietsschema
Sie kompilieren Ihre Gebietsschemadefinitionsdateien neu mit:
$ sudo locale-gen
Das ist es! Jetzt date
sollte der Befehl standardmäßig eine Ausgabe in einem Format ausgeben, das er selbst nativ als Eingabe akzeptieren kann.
$ date -d "$(date)"
Mon 17 Aug 2020 17:58:37 AWST