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 小时制)