Linux: Date, time, timezone, ntp

  • NTP 123 UDP port by default
  • в NTP есть возможность broadcasting/multicasting time информации для клиентов пассивно ожидающих обновления времени после первоначального round trip calibrating exchange
  • https://www.calculator.net/ – удобный сайт для расчета времени между двумя датами в разном виде (дней/часов/минут/секунд).
    https://www.calculator.net/time-calculator.html?tcday1=&tchour1=&tcminute1=51&tcsecond1=42&Op=-&tcday2=&tchour2=&tcminute2=37&tcsecond2=55&tcday3=&tchour3=&tcminute3=&tcsecond3=&ctype=1&x=80&y=29
Public NTP

pool.ntp.org # глобальный кластер ntp серверов, в общем случае при каждом запросе выдает новый адрес

time.windows.com # ntp microsoft, по факту находится в домене akamai CDN за time.microsoft.akadns.net

ntp.corbina.net # ntp corbina

~# ntpdate pool.ntp.org
30 Jan 15:52:50 ntpdate[15930]: adjust time server 95.216.136.148 offset 0.000537 sec
~# ntpdate pool.ntp.org
30 Jan 15:53:00 ntpdate[15931]: adjust time server 51.15.20.83 offset 0.003906 sec
~# ntpdate pool.ntp.org
30 Jan 15:53:09 ntpdate[15952]: adjust time server 195.91.239.8 offset -0.001487 sec
~# ntpdate pool.ntp.org
30 Jan 15:53:17 ntpdate[15956]: adjust time server 78.36.18.184 offset -0.007344 sec

STRATUM

stratum 0 examples: atomic clock, gps, cdma/gsm, radio waves

show

date – показывает дату и время. Вывод для удобства можно редактировать. Делал так для скрипта, который кладет логи в папку, чтобы можно было опрашивать просто по нужной дате и сортировать тупо-по имени без даты.

[root@host1 ~]# date
Tue Aug 2 12:31:11 MSK 2016
[root@host1 ~]# date "+%Y-%m-%d"
2016-08-02

Работа с датой:

date -u - UTC time (без timezone)
date +%s - Unix date/time
date +"%Y-%m-%d %T.%N" - дата с наносекундами/nanoseconds
date +"%T.%N" - время с наносекундами/nanoseconds (9 знаков после секунд)
date +"%T.%6N" - время с микросекундами/microseconds (6 знаков)
date +"%T.%3N" - время с миллисекундами/milliseconds (3 знака)
date --date "-3 day" - дата 3 дня от текущей
date --date="255 days ago" - дата 255 дней от текущей
date -d "24 Oct 2017" "+%s" - получаем дату в секундах с 1970 года (epoch date). Дату можно вставить в разных форматах - 24 Oct 2017, 2017-10-24, 20171024. Далее можно оперировать этой датой в скриптах.

Добавление/вычитание секунд ко времени в bash.

date '+%T' --date="16:16:16 MSK - 17 seconds"
16:15:59

timedatectl – в отличии от date, timedatectl показывает timezones. Можно посмотреть все таймзоны timedatectl list-timezones.

[user1@host1 ~]$ timedatectl
 Local time: Чт 2016-07-28 10:45:31 MSK
 Universal time: Чт 2016-07-28 07:45:31 UTC
 RTC time: Чт 2016-07-28 07:45:31
 Time zone: Europe/Moscow (MSK, +0300)
 NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
 DST active: n/a

[root@host1 ~]# timedatectl list-timezones | grep Moscow
Europe/Moscow
change

sudo date |date-time| – устанавливаем вручную дату и время.

[root@host1 ~]# sudo date 07131821
Wed Jul 13 18:21:00 MSK 2016
[root@host1 ~]# date
Wed Jul 13 18:21:01 MSK 2016

sudo date -s |STRING| – устанавливаем вручную дату/время в произвольном формате.

The --date=STRING is a mostly free format human readable date string such as "Sun, 29 Feb 2004 16:21:42 -0800" or "2004-02-29 16:21:42" or even "next Thursday". A date string may contain items indicating calendar date, time of day, time zone, day of week, relative time, relative date, and numbers. An empty string indicates the beginning of the day. The date string format is more complex than is easily documented here but is fully described in the info documentation.
[root@host1 ~]# date -s 20:02
Wed Aug 17 20:02:00 MSK 2016

timedatectl set-time 2015-08-12 – меняем текущую дату на August 12, 2015

[root@host1 ~]# timedatectl set-time 2015-08-12
[root@host1 ~]# date
Ср. авг. 12 00:00:01 MSK 2015

timedatectl set-time 11:00 – Меняем время на 11:00

[root@host1 ~]# timedatectl set-time 11:00
[root@host1 ~]# date
Ср. авг. 12 11:00:00 MSK 2015
UNIX TIME

date +”%T.%3N” -d @1559287471 Конвертация из unix time.

Timezone

timedatectl set-timezone Europe/Moscow – меняем таймзону на Europe/Moscow

NTP

sntp -S |server-ip/fqdn| – синхронизируем время с NTP сервером разово. NTP может работать плохо в условиях нагруженной сети или серверов.

# sntp -S pool.ntp.org
sntp 4.2.8p12@1.3728-o (1)
2021-02-14 14:39:56.228308 (-0300) -0.008129 +/- 0.006040 pool.ntp.org 37.228.129.2 s2 no-leap

ntpdate |server-ip/fqdn| – deprecated in favour of sntp. Четвертая версия NTP позволяет синхронизировать время с точностью до 10 мс (миллисекунд). Четвертая версия – версия по умолчанию при работе с ntpdate.

# apt show ntpdate
ntpdate is deprecated. Please use sntp instead for manual or scripted NTP queries/syncs.

# ntpdate pool.ntp.org
# date
Wed Jul 13 18:23:08 MSK 2016

# ntpdate ntp.corbina.net
 2 Aug 12:48:28 ntpdate[29563]: step time server 195.14.40.141 offset 1707901.165532 sec
# date
Tue Aug 2 12:48:30 MSK 2016

 -o version
Specify the NTP version for outgoing packets as the integer version, which can be 1, 2, 3 or 4. The default is 4. This allows ntpdate to be used with older NTP versions.

timedatectl set-ntp yes/no – включаем/отключаем постоянную синхронизацию с NTP.

[root@host1 ~]# timedatectl set-time 2017-01-13
Failed to set time: Automatic time synchronization is enabled
[root@host1 ~]# timedatectl set-ntp no
[root@host1 ~]# timedatectl set-time 2017-01-13
[root@host1 ~]# date
Fri Jan 13 00:00:02 MSK 2017

Leave a Reply