В моей системе сейчас по умолчанию 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
Я только что потратил около двух часов на поиск ответа на вопрос, который беспокоил меня годами, и наконец-то нашел его!!
По умолчанию date
выводит дату в формате текущей локали, например, en_GB.UTF-8
или en_AU.UTF-8
или de_DE.UTF-8
и т. д.
Ваша локаль по умолчанию похожа на мою и отображает даты в следующем формате:
date_fmt "%a %e %b %H:%M:%S %Z %Y"
К сожалению, это один из немногих форматов, которые команда date не может понять. Однако, еслиМожет понятьочень похожий формат
date_fmt "%a %e %b %Y %H:%M:%S %Z"
"Пт 29 Янв 2016 22:04:26 GMT" Работает
"Пт 29 Янв 22:04:26 GMT 2016" Не
Почему очень часто используемые локали en_GB.UTF-8 и en_AU.UTF-8 используют формат, который date
не может быть прочитан, я не знаю, но его очень легко настроить так, чтобы он больше вас не беспокоил, по крайней мере, пока вы не переустановите систему или ваши определения не будут перезаписаны слишком усердным обновлением >:-(
Как настроить формат даты в вашем регионе за три шага
Я нашел следующую информациюздесь:
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=запись. У меня английский австралийский:ru_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