Команда date позволяет задействовать одноименную утилиту, которая используется для двух целей. Обычно она используется для получения текущих даты и времени при необходимости в заданном формате, но при этом она также позволяет устанавливать их.
Стандартный синтаксис команды выглядит следующим образом:
$ date [описание времени или формата вывода]
Для начала рассмотрим вопрос установки текущих даты и времени, так как данное действие выполняется достаточно просто (единственная сложность связана с запоминанием формата даты и времени). Вы можете самостоятельно выполнить команду man date для того, чтобы уточнить формат даты и времени, используемый в вашей системе. В большинстве случаев он является следующим:
# date MMDDhhmm[[CC]YY][.ss]
Но все не так сложно, как кажется на первый взгляд. Параметры в квадратных скобках являются необязательными — вы можете как использовать их, так и отказаться от их использования. Каждая пара букв соответствует элементу записи даты или времени:
Элемент записи | Назначение |
MM | Месяц (от 01 до 12) |
DD | День (от 01 до 28, 29, 30 или 31 в зависимости от месяца) |
hh | Часы (от 00 до 24) |
mm | Минуты (от 00 до 59) |
YY | Две последние цифры года (от 00 до 99, не обязательно) |
CC | Век (от 00 до 99, используется вместе с предыдущим элементом, не обязательно) |
.ss | Секунды (от 00 до 59 с символом точки, не обязательно) |
Как утилита вычисляет век? В UNIX-подобных операционных системах время хранится в формате числа секунд, прошедших с 1 января 1970 года в часовом поясе GMT (также известном, как UTC). Из-за того, что с этой даты прошло достаточно много времени, а для хранения количества секунд в 32-битных системах используется 4-байтовое целочисленное значение, в 2038 году на этих системах должен произойти переход счетчика секунд через нулевое значение. Ввиду того, что подсчитывается лишь количество секунд, век попросту не принимается во внимание. Таким образом, на 32-битных системах значения года от 00 до 38 соответствуют 2000-м годам, а значения года от 70 до 99 — 1900 годам. Фактически, на 32-битных системах команда date не позволяет установить год, не входящий в приведенные выше диапазоны. В 64-битных системах все проще: для подсчета времени используется 8-байтовое целочисленное значение, поэтому имеется огромный запас по времени (292 миллиарда лет), доступен полный диапазон годов от 00 до 99, а век вычисляется обычным образом по количеству прошедших секунд.
Для установки текущих даты и времени необходимы права пользователя root, иначе вы получите аналогичное сообщение об ошибке:
date: невозможно установить дату: Операция не позволена
Команда date без параметров хороша в том случае, если вам нужно узнать текущие дату в время. Но функция вывода даты и времени в произвольном формате полезна при разработке сценариев командной оболочки. Иногда нужно использовать максимально краткую запись даты; иногда в сценарии нужно обрабатывать лишь время без даты; иногда дату и время приходится сравнивать с датой и временем из внешнего источника и это сравнение будет гораздо более простым в случае получения текущих даты и времени в том же формате, в котором передаются данные из внешнего источника.
Для форматирования текущих даты и времени в соответствии со своими предпочтениями пользователь должен передать утилите строку форматирования после символа +:
$ date +"<строка форматирования>"
Строка форматирования состоит из параметров форматирования, приведенных в таблице ниже.
Параметр форматирования | Назначение | Пример вывода |
%a | Сокращенное название дня недели | Чт |
%A | Полное название дня недели | Четверг |
%b | Сокращенное название месяца | июн |
%B | Полное название месяца | Июнь |
%d | Номер дня недели | 08 |
%D | Текущая дата в формате ММ/ДД/ГГ | 06/08/17 |
%F | Текущая дата в формате ГГГГ/ММ/ДД | 2017-06-08 |
%H | Часы в 24-часовом формате в диапазоне от 00 до 23 | 18 |
%l | Часы в 12-часовом формате в диапазоне от 01 до 12 | 6 |
%j | Номер дня года в диапазоне от 001 до 366 | 159 |
%m | Номер месяца в диапазоне от 01 до 12 | 06 |
%M | Минуты в диапазоне от 00 до 59 | 24 |
%S | Секунды в диапазоне от 00 до 60 | 22 |
%N | Наносекунды в диапазоне от 000000000 до 999999999 | 335288238 |
%T | Время в формате ЧЧ:ММ:СС в 24-часовом формате | 18:24:22 |
%u | Номер дня недели в диапазоне от 1 до 7 | 4 |
%U | Номер недели в году в диапазоне от 00 до 53 | 23 |
%Y | Полный номер года | 2017 |
%Z | Обозначение часового пояса | MSK |
Для получения текущих даты и времени в стандартном формате достаточно выполнить следующую команду:
$ date
Утилита выведет аналогичную информацию:
Чт июн 8 15:12:21 MSK 2017
Для вывода даты и/или времени в пользовательском формате достаточно добавить символ + и строку форматирования. Например, для вывода даты и времени может использоваться команда:
$ date +"%H:%M %d/%m/%Y"
В результате будет выведена следующая информация:
19:33 08/06/2017
Отличным примером использования команды date в сценариях является создание суффикса имени файла для автоматизированного создания нескольких файлов с аналогичными именами. Например, процесс создания создании резервных копий данных. Файл резервной копии данных создается с помощью утилиты tar и сохраняется на жестком диске большого, но не бесконечного объема. Локальная машина носит имя bugler, поэтому данное слово присутствует и в имени файла резервной копии. Файловая система с жесткого диска большого объема скопирована в директорию /bkup. Команда для создания резервных копий будет выглядеть следующим образом:
$ tar -zcf /bkup/bugler.backup.$(date +%a).tgz /
Она создает сжатый (благодаря параметру -z) файл архива всей файловой системы (благодаря символу / в конце команды) и сохраняет этот файл под именем /bkup/bugler.backup.Sat.tgz. В результате использования команды date при формировании имени файла, файл архива будет перезаписываться ровно через неделю, что позволит сэкономить дисковое пространство — оно будет просто повторно использоваться.
Примечание: конструкция $(<команда>) позволяет использовать вывод дополнительной команды в качестве части основной команды. Альтернативным решением является использование обратных кавычек: ...backup `date +%a`.tgz. При этом формат $(<команда>) гораздо проще в использовании.
В том случае, если вы не будете вводить необязательные элементы записи даты и времени, утилита будет считать, что вы выбрали текущий год. Таким образом, в случае исполнения следующей команды:
# date 06081540
системные часы будут переведены на 5 июня 2017 года (да, эта статья писалась именно в этот день). Теперь предположим, что нам нужно установить 2018 год. В этом случае команда примет следующий вид:
# date 0608154018
Для сравнения дат на локальном и удаленном компьютере достаточно настроить вход в удаленную систему без пароля и выполнить команду:
$ ssh root@<целевая система> date & date
Для установки локального времени на удаленном компьютере может использоваться следующая команда:
$ ssh root@<целевая система> "date $(date +%m%d%H%M.%S)"