дата: недопустимая дата при попытке установить дату в Linux в определенном формате

Вопрос или проблема

Я пытаюсь установить дату и время в 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:

  1. Формат ISO:

    date "+%d-%m-%C%y %H:%M:%S" -d "2017-01-19 00:05:01"

    Это вернёт:

    19-01-2017 00:05:01
  2. Использование текста для месяца:

    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 сентября).

Применение даты на другой системе

Если вы хотите скопировать дату и время с одной системы на другую, выполните следующие шаги:

  1. На исходной машине получите дату в нужном формате:

    date +%m%d%H%M%Y.%S
  2. На целевой машине установите полученную дату, не используя опцию --set:

    MY_DATE=$(date +%m%d%H%M%Y.%S)
    ssh <target> "date '${MY_DATE}'"

Обратите внимание, что при передаче команд через SSH важно использовать правильные кавычки, чтобы избежать разрыва интерпретатора между локальной и удаленной машинами.

При следовании этим рекомендациям вы сможете успешно установить нужную дату и время в Linux без ошибок.

Оцените материал
Добавить комментарий

Капча загружается...