zoukankan      html  css  js  c++  java
  • linux应用time和timezone

    linux中应用层(非内核层)time是怎样处理的?时区是怎样设置的?夏令时时是怎样实现的?NTP时间同步是怎么回事?本篇文章就在嵌入式linux应用中time和timezone相关问题总结。

    1. NTP

    经常说时间同步,同步就是为了获取统一的时间参考点。同步的时间来自授时中心,如ntp.pool.org。那NTP同步的时间是什么时间,包含时区吗?

    NTP同步的时间是UTC-0时间,所有授时中心的时间都是UTC-0时间。NTP遵循NTPv4协议,通过时间偏差来调整本地基准(或参考时间,由time()或gettimeofday()获取)。

    2. time

    linux应用中的基准时间是?

    通过man7 time可知UNIX systems represent time in seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC)。

    A  program can determine the calendar time using gettimeofday(2), which returns time (in seconds and microseconds) that have elapsed since the Epoch;

    time(2) provides similar  information,  but only with accuracy to the nearest second.

    When interpreted as an absolute time value, it represents the number of seconds elapsed since the Epoch, 1970-01-01 00:00:00 +0000 (UTC).

    time()或gettimeofday()返回的时间是日历时间,也是绝对时间,是unix系统应用基准时间。该时间表示自Epoch, 1970-01-01 00:00:00 +0000 (UTC)过去的秒数(或微妙数),与时区无关。

    所有系统在同一时间调用time()返回值都一样(除去误差),不管在什么时区,是否采用夏令时。

    time()返回time_t,是绝对秒数。

    gettimeofday()返回struct timeval,包含tv_sec绝对秒数,tv_usec绝对微妙数。 两个函数均是系统调用。
    3. timezone

    时区设置由libc库函数tzset()实现,其读取并解析文件/etc/TZ或环境变量TZ,将时区、是否采用夏令时保存到静态变量中,供localtime_r()转换本地时间时调用。

    void tzset (void);
    extern char *tzname[2];
    extern long timezone;
    extern int daylight;
    这些都是库函数,包含在头文件time.h中。

    4. broken-down time分解时间

    broken-down time由struct tm存储,包含年月日周天时分秒。最典型由localtime()函数获取,其为本地化时间(已转换为系统时区时间,并由变量tm_isdst指定是否支持夏令时)。

    localtime_r()是libc库函数,调用time()将其返回的时间转换为本地时间,其转换包含时区信息。

    5. 字符串时间

    虽然localtime()包含可识别的时间,但不便于打印,需要转换为字符串。

    strftime()按指定格式打印时间,asctime()按标准格式打印时间。

    6. date

    date显示的是本地时间(包含时区信息),底层实现调用localtime_r()(busybox实现)。也就是说date将绝对时间显示为本地时间,其根据时区调整显示时间。这样,上层应用(如时区更换)时换算更简单(都以绝对时间为参考)。


    根据以上分析,无论时区是否改变,是否采用夏令时,日历时间(或绝对时间)都不会改变。当设置的时区中包含夏令时时间段时,当夏令时时间切换时,上层应用调用localtime_r()自动将时间切换为夏令时时间。

    附:时间转换经典配图

    附:时间相关概念,转自linux编程中与时间相关的问题总结

    • GMT:Greenwich Mean Time,格林尼治平均时。格林尼治标准时间是19世纪中叶大英帝国的基准时间,同时也是事实上的世界基准时间。

    • UTC:Universal Time Coordinated,环球通用协调时间。基本上UTC的本质强调的是比GMT更为精确的世界时间标准,在不需要精确到秒的情况通常也将GMT和UTC视作等同

    • DST:Daylight Saving Time,指在夏天太阳升起的比较早时,将时钟拨快一小时以提早日光的使用;

    • CST:CST可以同时表示美国UT-6:00,澳大利亚UT+9:30,中国UT+8:00,古巴UT-4:00四个国家的标准时间;

    • Epoch:时间轴上特定的一个时间点,定义为从格林威治时间1970年01月01日00时00分00秒。记为1970年1月1日00:00:00 UTC

    • UNIX时间戳:英文表示为Unix timestamp、Unix time或者POSIX time。是从Epoch开始所经过的秒数,不考虑闰秒。在大多数的UNIX系统中UNIX时间戳存储为32位,这样会引发2038年问题或Y2038

    • Calendar Time:表示的意义同UNIX时间戳。

    • Broken-down Time:使用tm结构存储的时间,tm 数据结构将时间分别保存到代表年,月,日,时,分,秒等不同的变量中,不再是一个令人费解的64位整数。tm数据结构是各种自定义格式转换函数所需要的输入形式

    • Real-Time:也称wall-clock,即我们人类自然感受的时间。

    • Virtual-Time:进程执行所占用的cpu时间(即站在进程的角度看时间),如果在过去的一秒钟指定进程没有被调用,则virtual time为0s,real time为1s。

    • Prof-Time:系统在用户态和内核态所占用cpu时间的总和;

    • clock tick:时钟滴答,当PIT通道0的计数器减到0值时,它就在IRQ0上产生一次时钟中断,即一次时钟滴答。

    • jiffies:记录着从电脑开机到现在总共的”时钟中断”的次数。启动时内核将该变量初始化为0,此后每次时钟中断处理程序都会增加该变量的值。jiffies类型为无符号长整型(unsigned long),其他任何类型存放它都不正确。

    • xtime:从cmos电路或rtc芯片中取得的时间,一般是从某一历史时刻开始到现在的时间;

    参考:

    1. 解决嵌入式Linux中的时区问题

    2. linux下时区的一些认识

    3. time函数

    4. linux编程中与时间相关的问题总结

    5. NTP协议

  • 相关阅读:
    Git 菜鸟变大神 (一) 本地仓库的创建和初始化
    Dubbo项目实战 (二) 注册中心zookeeper-3.4.6集群以及高可用
    Dubbo项目实战 (一)服务划分粒度
    枚举类的理解和应用
    全文检索原理及实现方式
    MinIO简介和java Api的使用
    js金额转中文大写
    文档相关工具
    JS特殊监听方法
    注解的使用、拦截器使用、AOP切面使用
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/7087558.html
Copyright © 2011-2022 走看看