1. linux 時間同步
在Linux系統中存在兩個時鍾時間,分別是
硬體時鍾是指的在主板上的時鍾設備,也就是通常可以在BIOS畫面設置的時鍾,即使關機狀態也可以計算時間。
而系統時鍾則是指Kernel中的時鍾,其值是由1970年1月1日00:00:00 UTC時間至當前時間所經歷的秒數總和。當Linux啟動的時候,系統時鍾會讀取硬體時鍾的設定,之後系統時鍾獨立運作。長時間運行兩者可能將會產生誤差。另外所有的Linux相關指令都是讀取系統時鍾指定的,如date。
我們這里討論的是系統時間。
NTP,網路時間協議,使用 123/udp 埠進行網路時鍾同步;NTP 是仍在使用中的最古老的網路傳輸協議之一(1985 年前開始)。
以前Linux時間同步基本是使用 ntpdate 和 ntpd 這兩個工具實現的,但是這兩個工具已經很古老了。
【注】ntpdate和ntpd是互斥的,兩者不能同時使用。ntpd是步進式平滑的逐漸調整時間,而ntpdate是斷點式更新時間。
RHEL/CentOS 7.x 已經將 chrony 作為默認時間同步工具了。
其他Linux (如 ubuntu) 使用 systemd-timesyncd 服務。
chrony 是 RedHat 開發的,它是網路時間協議(NTP)的另一種實現;
RHEL/CentOS 7.x 的默認時間同步工具;
chrony 可以同時做為 ntp 服務的客戶端和服務端;安裝完後有兩個程序 chronyd、chronyc:
chronyd 是一個 daemon 守護進程,chronyc 是用來監控 chronyd 性能和配置參數的命令行工具。
系統版本:CentOS 7.5
chrony_server(relay):10.0.0.4
chrony_client:10.0.0.5
Edit file /etc/chrony.conf
默認已經啟動,不需要調整
example:
配置 chrony
edit file: /etc/chrony.conf
再次用chronyc 命令檢查,比較它與chronyd server的差異
systemd-timesyncd 是一個用於跨網路同步系統時鍾的守護服務。它實現了一個 SNTP 客戶端,但更輕量級,更集成systemd。
systemd-timesyncd 啟動時會讀取 /etc/systemd/timesyncd.conf 配置文件,內容如下:
你可以輸入你希望使用的其它時間伺服器,比如你自己的本地 NTP 伺服器,在 NTP= 行上輸入一個以空格分隔的伺服器列表。
如果伺服器可以直接連接internet,不用修改默認配置;如果在內網,需要單獨指定。
在最新的 Ubuntu 版本中,timedatectl 替代了老舊的 ntpdate。默認情況下,timedatectl 在系統啟動的時候會立刻同步時間,並在稍後網路連接激活後通過 socket 再次檢查一次。
timesyncd 替代了 ntpd 的客戶端的部分。默認情況下 timesyncd 會定期檢測並同步時間。它還會在本地存儲更新的時間,以便在系統重啟時做時間單步調整。
通過 timedatectl 和 timesyncd 設置的當前時間狀態和時間配置,可以使用 timedatectl status 命令來進行確認。
由於 timedatectl 的存在,各發行版已經棄用了 ntpdate,默認不再進行安裝。
timedatectl
timedatectl status ,查看時間同步狀態;
timedatectl set-ntp true ,開啟網路時間同步;
timedatectl set-timezone ZONE ,設置時區。
NTP synchronized: yes 表示時間是同步狀態。
查看服務狀態以及從哪個ntp server同步時間。
NTP:軟體層面實現,成本低。同步精度10ms左右。
PTP:需要網路介面具備在物理層提供時間戳的功能,同步精度優於100ns,區域網的節點需要使用支持PTP功能的交換機。區域網網路接點不支持PTP的話,只能同不到us,而且受網路背景流量影響。
2. linux下 如何將年月日時分秒格式轉換為秒
什麼語言實現?
+ ====== 如何在不同編程語言中實現普通時間 → Unix時間戳(Unix timestamp)? ======
+
+ java long epoch = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").parse("01/01/1970 01:00:00");
+
+ JavaScript var commonTime = new Date(Date.UTC(year, month - 1, day, hour, minute, second))
+
+ MySQL SELECT unix_timestamp(time) 時間格式: YYYY-MM-DD HH:MM:SS 或 YYMMDD 或 YYYYMMDD
+
+ Perl 先 use Time::Local 然後 my $time = timelocal($sec, $min, $hour, $day, $month, $year);
+
+ PHP mktime(hour, minute, second, day, month, year)
+
+ PostgreSQL SELECT extract(epoch FROM date('YYYY-MM-DD HH:MM:SS'));
+
+ Python 先 import time 然後 int(time.mktime(time.strptime('YYYY-MM-DD HH:MM:SS', '%Y-%m-%d %H:%M:%S')))
+
+ Ruby Time.local(year, month, day, hour, minute, second)
+
+ SQL Server SELECT DATEDIFF(s, '1970-01-01 00:00:00', time)
+
+ Unix / Linux date +%s -d"Jan 1, 1970 00:00:01"
+
+ VBScript / ASP DateDiff("s", "01/01/1970 00:00:00", time)
3. linux怎麼將時間戳轉換為時間
可以用date的-d參數,致於函數可以自己寫一個:
date命令可以將標準的時間格式轉換成版unix時間戳
例如:權
12#
date
-d
'2014-11-24
13:10'
+%s1416805800同樣也可以使用date命令將unix時間戳轉換成標準的時間格式
例如:
12#
date
-d
'1970-01-01
UTC
1416805800
seconds'Mon
Nov
24
13:10:00
CST
2014
4. Linux 系統dmesg 時間戳轉換為易於閱讀的格式2022-5-20
Linux 系統dmesg 時間戳轉換為易於閱讀的格式
Linux內核的 dmesg 結果顯示了時間戳。 從內核[啟動時間[開始] ,是秒數。
~# dmesg -h 查看幫助
-T,–ctime
列印人類可讀的時間戳。
請注意,時間戳記可能不正確! 掛起/恢復系統後,用於日誌的時間源不會更新。
5. linux時間戳命令
date指令相關用法示例
date 用法: date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
直接輸入date
%H : 小時(00..23)
%I : 小時(01..12)
%k : 小時(0..23)
%l : 小時(1..12)
%M : 分鍾(00..59)
%p : 顯示本地 AM 或 PM
%r : 直接顯示時間 (12 小時時制,格式為 hh:mm:ss [AP]M)
%s : 從 1970 年 1 月 1 日 00:00:00 UTC 到當前為為止的秒數
%S : 秒(00..61)
%T : 直接顯示時間 (24 小時制)