当前位置:   article > 正文

嵌入式Linux系统时间和RTC时间

rtc时间

1 概念

1.1 “系统时间”与“硬件时间”

Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟。系统时钟是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的时钟,这个硬件时钟可以在BIOS中进行设置。当Linux启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作。
Linux中的所有命令(包括函数)都是采用的系统时钟设置。在Linux中,用于时钟查看和设置的命令主要有date、hwclock。

1.2  “UTC时间”与“本地时间”

UTC时间:(英:Coordinated Universal Time ,法:Temps Universel Coordonné ) 世界协调时间(又称世界标准时间、世界统一时间),在一般精度要求下,它与GMT(Greenwich Mean Time,格林威治标准时间)是一样的,其实也就是说 GMT≈UTC,但 UTC 是以原子钟校准的,更精确。

本地时间:由于处在不同的时区,本地时间一般与UTC是不同的,换算方法就是
本地时间 = UTC + 时区 或 UTC = 本地时间 - 时区
时区东为正,西为负,例如在中国,本地时间都使用北京时间,在linux上显示就是 CST(China Standard Time,中国标准时,注意美国的中部标准时Central Standard Time也缩写为CST,与这里的CST不是一回事!),时区为东八区,也就是 +8 区,所以 CST=UTC+(+8小时) 或 UTC=CST-(+8小时)。

1.3 NTP协议

NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步。NTP基于UDP报文进行传输,使用的UDP端口号为123。
使用NTP的目的是对网络内所有具有时钟的设备进行时钟同步,使网络内所有设备的时钟保持一致,从而使设备能够提供基于统一时间的多种应用。
对于运行NTP的本地系统,既可以接收来自其他时钟源的同步,又可以作为时钟源同步其他的时钟,并且可以和其他设备互相同步。

2 NTP同步时间

ntpdate [-46bBdqsuv] [-a key#] [-e delay] [-k file] [-p samples] [-o version#] [-t timeo] server ...

2.1 ntpdate同步时间

# ntpdate ntp.aliyun.com
 5 Feb 14:42:13 ntpdate[1006]: adjust time server 203.107.6.88 offset +0.015180 sec

除了使用ntpdate还可以使用ntpd应用程序,ntpd既是客户端用于本机的时间同步,又是服务器可以给其他机器同步时间。ntpd和ntpdate优缺点自行查阅资料,一般情况下嵌入式系统使用ntpdate就足够了。

ntpdate获取的是UTC时间,而不是当前的本地时间,所以ntpdate后系统的utc时间被校准了。比如说,当前北京时间是15:00点,那么ntpdate获取的时间是7:00,如果Linux系统中没有设置时区,

那么date命令或者其他时间函数获取的时间显示的都是7:00,而不是15:00,时区是需要自己手动设置的,后面在讲。

2.2 常用的NTP服务器

  1. MacOS上自带的两个:
  2. time.apple.com
  3. time.asia.apple.com
  1. #阿里NTP服务器
  2. ntp.aliyun.com
  3. ntp1.aliyun.com
  4. ntp2.aliyun.com
  5. ntp3.aliyun.com
  6. ntp4.aliyun.com
  7. ntp5.aliyun.com
  8. ntp6.aliyun.com
  9. ntp7.aliyun.com

2.3 date时间显示

date默认显示是UTC根据时区调整后的时间。如果想单纯的显示UTC时间可以使用-u参数

# date
Fri Feb  5 14:49:14 CST 2021
# date -u //显示UTC时间
Fri Feb  5 06:49:18 UTC 2021
# date -R    //显示时区
Fri, 05 Feb 2021 14:49:27 +0800 
#

2.4 hwclock( 这里以君正的x2000为参考,其他平台不知道)

hwclock有几个重要的参数,尤其-u和--localtime不好理解:

-w 将Linux系统时间写入到RTC中。

-s 从RTC设置系统时间

-u RTC中存储的时间值代表UTC时间,和date命令中的-u是两回事,完全不一样,不要混了。

--localtime RTC中存储的时间代表本地时间(也就是系统时间或者叫做UTC经过时区调整后的时间)

# echo $TZ //查看当前系统的时区
CST-8:00  我这里的时区为中国的东8区
#
# date //查看当前系统时间
Fri Feb  5 15:22:36 CST 2021
# date -u //查看当前UTC时间
Fri Feb  5 07:22:44 UTC 2021
#
# hwclock -uw //将当前系统的UTC时间写入到RTC中
#
# hwclock //查看RTC中的时间,这里的时间只是一个值没有时区的概念
Fri Feb  5 07:23:11 2021  0.000000 seconds
#
# hwclock -u //把RTC的值当成UTC,然后显示系统时间。这条命令会把RTC中的值当成UTC,然后根据当前系统设置的时区调整再显示时间,我的系统时区是东八区,所以这条命令显示的是RTC值加上8小时
Fri Feb  5 15:23:21 2021  0.000000 seconds
#
# hwclock --localtime //简单的把RTC中的值当成本地去时间(系统时间)显示,这里面没有做任何时区的调整。
Fri Feb  5 07:23:49 2021  0.000000 seconds
#

3 Linux时区TZ环境变量

TZ这个环境变量可以在ubuntu下面,使用man tzset查看解释:

  1. TZSET(3) Linux Programmer's Manual TZSET(3)
  2. NAME
  3. tzset, tzname, timezone, daylight - initialize time conversion information
  4. SYNOPSIS
  5. #include <time.h>
  6. void tzset (void);
  7. extern char *tzname[2];
  8. extern long timezone;
  9. extern int daylight;
  10. Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
  11. tzset(): _POSIX_C_SOURCE
  12. tzname: _POSIX_C_SOURCE
  13. timezone, daylight: _XOPEN_SOURCE
  14. || /* Glibc since 2.19: */ _DEFAULT_SOURCE
  15. || /* Glibc versions <= 2.19: */ _SVID_SOURCE
  16. DESCRIPTION
  17. The tzset() function initializes the tzname variable from the TZ environment variable. This function is automatically called by the other time conversion functions that depend on the time‐
  18. zone. In a System-V-like environment, it will also set the variables timezone (seconds West of UTC) and daylight (to 0 if this timezone does not have any daylight saving time rules, or to
  19. nonzero if there is a time, past, present or future when daylight saving time applies).
  20. If the TZ variable does not appear in the environment, the system timezone is used. The system timezone is configured by copying, or linking, a file in the tzfile(5) format to /etc/local‐
  21. time. A timezone database of these files may be located in the system timezone directory (see the FILES section below).
  22. If the TZ variable does appear in the environment, but its value is empty, or its value cannot be interpreted using any of the formats specified below, then Coordinated Universal Time (UTC)
  23. is used.
  24. The value of TZ can be one of two formats. The first format is a string of characters that directly represent the timezone to be used:
  25. std offset[dst[offset][,start[/time],end[/time]]]
  26. There are no spaces in the specification. The std string specifies an abbreviation for the timezone and must be three or more alphabetic characters. When enclosed between the less-than (<)
  27. and greater-than (>) signs, the characters set is expanded to include the plus (+) sign, the minus (-) sign, and digits. The offset string immediately follows std and specifies the time
  28. value to be added to the local time to get Coordinated Universal Time (UTC). The offset is positive if the local timezone is west of the Prime Meridian and negative if it is east. The hour
  29. must be between 0 and 24, and the minutes and seconds 00 and 59:
  30. [+|-]hh[:mm[:ss]]
  31. The dst string and offset specify the name and offset for the corresponding daylight saving timezone. If the offset is omitted, it defaults to one hour ahead of standard time.
  32. ...
  33. ...

TZ是一个环境变量,很多时区相关的函数都会去读取这个环境变量。详细的可以看英文解释,这里面我简单的记录一下。

TZ有两种用法,第一种就是按照时区格式书写的一个字符串,另一个是TZ为一个配置文件的名字,详细的配置在配置文件中,嵌入式系统常用的是第一种。

当TZ直接使用字符串的方式,格式如下:

 std offset[dst[offset][,start[/time],end[/time]]]

这里面比较重要的就是stdoffset

std指定时区的缩写,必须是3个或3个以上字符。

offset是一个指定的时间值,本地时间+offset等于UTC时间,或者说UTC减去offset就是本地时间,offset是有正负的,如果为正(+)代表本初子午线以西。

如果为负代表本初子午线以东,也就是常说的东几区。

offset格式为:

 [+|-]hh[:mm[:ss]]

比如中国东8区表示为-08:00。(这里跟常规理解的正好相反,正常我们看到东8区是+0800)。

比如北京时间,完整的TZ字符串可以表示为:

BEIJING-8或者BEIJING-08:00或者ABCD-8:00:00重点是offset别写错了,std只是一个提示符号,比如中国标准时间的是CST,世界统一时间是UTC,并不参与计算。

4 总结

嵌入式系统时间校准的流程如下:

  1. # export TZ=CST-08:00 //这个一般在rcS里面或者profile里面,或者setenv设置
  2. #
  3. # ntpdate ntp.aliyun.com
  4. 5 Feb 16:12:00 ntpdate[968]: adjust time server 203.107.6.88 offset +0.474072 sec
  5. #
  6. # hwclock -uw
  7. #
  8. # date
  9. Fri Feb 5 16:12:17 CST 2021
  10. #
  11. #

参考链接:

 

1. Linux基础命令
hwclock   https://www.cnblogs.com/wj78080458/p/9806774.html

2. linux系统时间和硬件时钟问题(date和hwclock)
http://blog.chinaunix.net/uid-182041-id-3464524.html

3. 国内常用NTP服务器地址
http://ddrv.cn/a/163546

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/459186
推荐阅读
相关标签
  

闽ICP备14008679号