Как настроить формат даты в вашем регионе за три шага

Как настроить формат даты в вашем регионе за три шага

В моей системе сейчас по умолчанию 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

Связанный контент