Linux: установить дату через командную строку

77

Как изменить системную дату в Linux?

Я хочу измениться:

  • Только год
  • Только месяц
  • Только дата
  • Любая комбинация выше трех
SHW
источник
2
Вы можете использовать, например, date --set='-2 years'установить часы на два года назад, оставив все остальные элементы идентичными. Вы можете изменить месяц и день месяца таким же образом. Я не проверял, что произойдет, если в результате этих вычислений дата и время фактически не будут существовать, например, во время перехода на летнее время, но поведение должно быть идентичным обычному поведению «установить и дату, и время для конкретных значений».
Кристиан Северин
Предполагая, что вы пытаетесь установить дату на текущее время, вы можете сделать так, sudo ntpd -gqчтобы система автоматически обновлялась с помощью службы ntp.
Стивен Сорока

Ответы:

96

Используйте date -s:

date -s '2014-12-25 12:34:56'

Запустите это как root или под sudo. Изменение только одного из года / месяца / дня является более сложной задачей и будет включать повторяющиеся биты текущей даты. Существуют также инструменты даты с графическим интерфейсом, встроенные в основные среды рабочего стола, доступ к которым обычно осуществляется через часы.

Чтобы изменить только часть времени, вы можете использовать подстановку команд в строке даты:

date -s "2014-12-25 $(date +%H:%M:%S)"

изменит дату, но сохраню время. См man dateформатирования детали для построения других комбинаций: отдельные компоненты %Y, %m, %d, %H, %M, и %S.

Майкл Гомер
источник
Я не хочу менять время
SHW
5
Там нет возможности сделать это. Вы можете использовать, date -s "2014-12-25 $(date +%H:%M:%S)"чтобы изменить дату и повторно использовать текущее время, хотя.
Майкл Гомер
пришел сюда и часы, а также минуты соответствовали текущему времени. - приятно
Alex2php
3
date: cannot set date: Invalid argument
Крис Стрычински,
@MichaelHomer @SHW можно изменить только дату с помощью команды вроде date -s 2018-01-01. Кто-то также поделился этим в ответе: superuser.com/questions/870068/…
baptx
42

Системное время

Вы можете использовать dateдля установки системной даты. Реализация GNU date(как встречается в большинстве не встроенных систем на основе Linux) принимает множество различных форматов для установки времени, вот несколько примеров:

установить только год:

date -s 'next year'
date -s 'last year'

установить только месяц:

date -s 'last month'
date -s 'next month'

установить только день:

date -s 'next day'
date -s 'tomorrow'
date -s 'last day'
date -s 'yesterday'
date -s 'friday'

установить все вместе:

date -s '2009-02-13 11:31:30' #that's a magical timestamp

Аппаратное время

Теперь системное время установлено, но вы можете синхронизировать его с аппаратными часами:

Используйте --showдля печати аппаратного времени:

hwclock --show

Вы можете установить аппаратные часы на текущее системное время:

hwclock --systohc

Или системное время на аппаратные часы

hwclock --hctosys
хаос
источник
2
Бонусные баллы за иллюстрацию неочевидных способов установки даты на примерах и за указание на разницу между «системным временем» и «аппаратными часами». Очень полезный ответ!
Марк Эдингтон
3

Вы меняете дату с помощью dateкоманды. Тем не менее, команда ожидает полную дату в качестве аргумента:

# date -s "20141022 09:45"
Wed Oct 22 09:45:00 BST 2014

Чтобы изменить часть даты, выведите текущую дату с частью даты, которую вы хотите изменить, в виде строки, а все остальные - в качестве переменных форматирования даты. Затем передайте это date -sкоманде, чтобы установить это:

# date -s "$(date +'%Y12%d %H:%M')"
Mon Dec 22 10:55:03 GMT 2014

меняет месяц на 12-й месяц - декабрь.

Форматы даты:

  • %Y - год
  • %m - месяц
  • %d - день
  • %H - час
  • %M - минута
garethTheRed
источник
Я пытаюсь изменить, но это не меняется: - $ sudo date --set = "2015-09-30 10: 05: 59.990" Ср 30 сентября 10:05:59 +0530 2015 $ date Чт 23 мая 15:10:37 +0530 2019
Винод
2

Для таких как я, использующих ESXI 5.1, вот что мне ответила система

~ # date -s "2016-03-23 09:56:00"
date: invalid date '2016-03-23 09:56:00'

Вместо этого мне пришлось использовать конкретную команду ESX:

esxcli system time set  -y 2016 -M 03 -d 23  -H 10 -m 05 -s 00
Balmipour
источник
3
Спасибо за -1, но не могли бы вы объяснить, почему ? Если вы получили лучший / более полный / более точный ответ, не стесняйтесь комментировать.
Balmipour
1

Команда для изменения системной даты есть date.

Существует два способа вызова команды date (в Linux):

   date [OPTION]... [+FORMAT]
   date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

Легко

Самый простой способ - использовать, date -sпоскольку он позволяет использовать простые относительные даты.

 $ date -s yesterday; date
 date: cannot set date: Operation not permitted
 Sat Jan  5 07:21:07 EST 2019
 Sun Jan  6 07:21:07 EST 2019

Дата не изменилась, потому что она была выполнена с ограниченным пользователем $. Если вы действительно хотите изменить дату, используйте root ( #) или sudo:

 $ sudo date -s yesterday; date
 Sat Jan  5 07:21:07 EST 2019
 Sat Jan  5 07:21:07 EST 2019

Таким образом, изменить любую часть относительной даты так же просто, как назвать ее:

 $ date -s "5 years ago"
 Mon Jan  6 08:26:26 EST 2014

 $ date -s "+6 months"
 Sat Jul  6 08:28:39 EDT 2019

 $ date -s "+3 hours -13 minutes"
 Sun Jan  6 11:16:59 AST 2019

Абсолютные даты немного сложнее, так как им нужно больше деталей:

 $ date -s "2001-07-23 10:11:12"

Или вы можете использовать команду date дважды:

 $ date -s "$(date +'%Y-%m-%d %H:%M:%S')"

замените любое из %допустимым значением, и дата будет установлена ​​(только как корень).

 $ date -s "$(date +'%Y-11-%d %H:%M:%S')"
 Wed Nov  6 08:37:15 EST 2019

непосредственный

Вторая форма вызова даты используется для непосредственного изменения системной даты.

 date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

Так :

 date 11230812              # MMDDhhmm

Дата будет установлена ​​23 ноября в 08 ч. И 12 мин.

BSD имеет аналогичную команду, но в другом формате ([[[[[cc] гг] мм] дд] чч] мм [.ss]).

Попробуйте dateкак пользователь с ограниченными правами увидеть, что он будет делать (ничего не меняя):

 $ date 11230812
 date: cannot set date: Operation not permitted
 Sat Nov 23 08:12:00 EST 2019

Или, если вы действительно хотите изменить дату как root:

 # date 11230812
 # date
 Sat Nov 23 08:12:00 EST 2019

Обратите внимание, что такие службы, как NTP или chrony, будут затронуты. И, если перезапустить, сбросит дату обратно на реальную.

Добавьте YY, чтобы установить год:

 $ date 1123081222
 date: cannot set date: Operation not permitted
 Wed Nov 23 08:12:00 EST 2022

Или CCYY, чтобы установить год и век:

 $ date 112308121982
 date: cannot set date: Operation not permitted
 Tue Nov 23 08:12:00 EST 1982
Исаак
источник
-1

Я использовал команду даты и формат времени, перечисленные ниже, чтобы успешно установить дату из команды оболочки терминала, выполняемой на Android Things, которая использует Linux Kernal.

дата 092615002017.00

MMDDHHMMYYYY.SS

ММ - Месяц - 09

ДД - День - 26

ЧЧ - час - 15

ММ - Мин - 00

ГГГГ - Год - 2017

.SS - второй - 00

Брук Олдре
источник
Поскольку это не работает ни с GNU, ни с BSD date, не могли бы вы добавить дополнительную информацию о том, к какой системе это относится и как это относится к данному конкретному вопросу.
Кусалананда