Вопрос или проблема
Я пытаюсь установить дату и время в Linux в определённом формате, но постоянно получаю ошибку. Пример:
date "+%d-%m-%C%y %H:%M:%S" -d "19-01-2017 00:05:01"
или
date +"%d-%m-%C%y %H:%M:%S" -d "19-01-2017 00:05:01"
Постоянно выдает эту ошибку:
date: недопустимая дата '19-01-2017 00:05:01'
Проблема, похоже, заключается в вашей “строке даты”, т.е. "19-01-2017 00:05:01"
.
Согласно странице man:
Параметр --date=STRING — это в основном свободный формат человеком читаемой строки даты, такой как "Вс, 29 Фев 2004 16:21:42 -0800" или
"2004-02-29 16:21:42" или даже "следующий четверг". Строка даты может содержать элементы, указывающие на календарную дату, время суток,
часовой пояс, день недели, относительное время, относительную дату и числа.
Теперь, “в основном свободный формат человеком читаемой даты” немножко неопределённо, и выглядит так, что 19-01-2017
не является читабельным. Возможно, потому что она может быть неразборчивой в таких случаях, как 02-03-2019
(это март, 02 или февраль, 03?).
Попробуйте изменить формат на ISO:
$> date "+%d-%m-%C%y %H:%M:%S" -d "2017-01-19 00:05:01"
19-01-2017 00:05:01
Или используйте формат, как в примере на странице man:
$> date "+%d-%m-%C%y %H:%M:%S" -d "19 Jan 2017 00:05:01"
19-01-2017 00:05:01
Чтобы получить дату/время с одной системы и применить его к другой:
Чтобы получить дату/время в правильном формате на исходном компьютере: date +%m%d%H%M%Y.%S
Чтобы установить время на целевом компьютере, сделайте date <строка>
– обратите внимание, не используйте –set. Например, используя ssh для установки времени целевого компьютера таким же, как у этого компьютера:
MY_DATE=$(date +%m%d%H%M%Y.%S)
ssh <целевой> "date '${MY_DATE}'"
Ответ или решение
Для корректной установки даты и времени в Linux вы столкнулись с ошибкой, связанной с тем, что формат даты, который вы используете, некорректен. Ваше выражение date "+%d-%m-%C%y %H:%M:%S" -d "19-01-2017 00:05:01"
возвращает ошибку invalid date
, потому что строка даты, содержащая формат 19-01-2017
, не является стандартным и не вполне читаемым для утилиты date
.
Согласно документации man
, параметр --date=STRING
ожидает строку даты в свободном формате, который может быть различным, но идеальным считается использование форматов, которые меньше подвержены недопониманию. Например, формат ISO (ГГГГ-ММ-ДД ЧЧ:ММ:СС
) является наиболее понятным и безопасным.
Попробуйте использовать один из следующих форматов, которые более совместимы с date
:
-
Формат ISO:
date "+%d-%m-%C%y %H:%M:%S" -d "2017-01-19 00:05:01"
Это вернёт:
19-01-2017 00:05:01
-
Использование текста для месяца:
date "+%d-%m-%C%y %H:%M:%S" -d "19 Jan 2017 00:05:01"
Это также вернёт:
19-01-2017 00:05:01
Эти форматы более однозначны и не вызывают двусмысленности, как, например, 19-01-2017
, что могло бы быть неправильно интерпретировано (возможное недопонимание о том, является ли это 19 января или 1 сентября).
Применение даты на другой системе
Если вы хотите скопировать дату и время с одной системы на другую, выполните следующие шаги:
-
На исходной машине получите дату в нужном формате:
date +%m%d%H%M%Y.%S
-
На целевой машине установите полученную дату, не используя опцию
--set
:MY_DATE=$(date +%m%d%H%M%Y.%S) ssh <target> "date '${MY_DATE}'"
Обратите внимание, что при передаче команд через SSH важно использовать правильные кавычки, чтобы избежать разрыва интерпретатора между локальной и удаленной машинами.
При следовании этим рекомендациям вы сможете успешно установить нужную дату и время в Linux без ошибок.