• Linux 时区与时间time


    UTC时间:这是一个与时区相关的时间,目前将世界时区分为24个:

    UTC跟GMT(Greenwich Mean Time,格林威治时间)一致,因为格林威治位于0时区,UTC时间即是0时区的时间。中国位于东八区,所以对应的时间是UTC时间加8小时,即UTC+8,也称为CST(China Standard Time)。UTC倾向于跟标准相关的时间。UTC的查看可以通过date命令(命令需要加上-u,否则看到的是本地时间,即UTC+8的时间);

    RTC:Real Time Clock,实时时钟。RTC和UTC不是一个概念上的时间,RTC通常指的是系统上一个计时的芯片,它将时间保存在CMOS中,而CMOS通过电池可以保持数据不丢失,因此在系统没有上电的情况下也还会正常运行。操作系统启动时会查看这个时间,也可以同步这个时间。RTC倾向于跟硬件相关的时间。查看RTC的命令如下(当前最好在root用户下)

     Calendar Time:日历时间,指的是从当前时间到某个标准时间经历的秒数。这里的某个时间通常是指1970年1月1日0时0分0秒,这个时间点也被称为Epoch。日历时间是一个相对的时间值,倾向于跟软件相关。

    与时间相关的常用函数:

    1. /* Return the current time and put it in *TIMER if TIMER is not NULL. */
    2. extern time_t time (time_t *__timer) __THROW;

    它的入参和返回值都是time_t,它实际上就是一个长整型,表示的就是从Epoch到函数调用之时经历的秒数,也就是前面提到的日历时间。为了得到这个时间,通常传入一个NULL作为参数,返回值就是我们需要的。

    1. #include <stdio.h>
    2. #include <time.h>
    3. time_t time_test(void)
    4. {
    5. time_t t = time(NULL);
    6. return t;
    7. }
    8. int main(int argc, char *argv[])
    9. {
    10. time_t t = time_test();
    11. printf("time_test:%ld\n", t);
    12. return 0;
    13. }

    执行结果:

    gmtime()函数会利用time_t的值,并将其转换为一个真正的时间,从函数名称就可以看出来是格林威治时间,也就是UTC的时间。与gmtime对应的就是转化为本地时间的函数localtime()。它们的函数原型如下:

    1. # ifdef __USE_POSIX
    2. /* Return the `struct tm' representation of *TIMER in UTC,
    3. using *TP to store the result. */
    4. extern struct tm *gmtime_r (const time_t *__restrict __timer,
    5. struct tm *__restrict __tp) __THROW;
    6. /* Return the `struct tm' representation of *TIMER in local time,
    7. using *TP to store the result. */
    8. extern struct tm *localtime_r (const time_t *__restrict __timer,
    9. struct tm *__restrict __tp) __THROW;
    10. # endif /* POSIX */

    这两个函数的返回值就是前面提到的结构体strum tm,接收的参数就是time()函数的返回值time_t;

    1. #include <stdio.h>
    2. #include <time.h>
    3. time_t time_test(void)
    4. {
    5. time_t t = time(NULL);
    6. return t;
    7. }
    8. struct tm *gmttime_test(time_t *t)
    9. {
    10. struct tm *tm;
    11. tm = gmtime(t);
    12. return tm;
    13. }
    14. struct tm *localtime_test(time_t *t)
    15. {
    16. struct tm *tm;
    17. tm = localtime(t);
    18. return tm;
    19. }
    20. int main(int argc, char *argv[])
    21. {
    22. time_t t = time_test();
    23. printf("time_test:%ld\n", t);
    24. struct tm *tm = gmttime_test(&t);
    25. printf("%4d-%02d-%02d %02d:%02d:%02d %s\n", tm->tm_year + 1900, tm->tm_mon + 1,tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_zone);
    26. tm = NULL;
    27. tm = localtime_test(&t);
    28. printf("%4d-%02d-%02d %02d:%02d:%02d %s\n", tm->tm_year + 1900, tm->tm_mon + 1,tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_zone);
    29. return 0;
    30. }

    执行结果:

     注意:struct tm里 年和月两个值的参考值,所以需要增加特定的偏移之后才是真实值。从测试程序可看出本地时间和UTC时间之间的差异刚好是8小时。

    ctime()和asctime(): 可自己实现显示时间的字符串

    1. __BEGIN_NAMESPACE_STD
    2. /* Return a string of the form "Day Mon dd hh:mm:ss yyyy\n"
    3. that is the representation of TP in this format. */
    4. extern char *asctime (const struct tm *__tp) __THROW;
    5. /* Equivalent to `asctime (localtime (timer))'. */
    6. extern char *ctime (const time_t *__timer) __THROW;
    7. __END_NAMESPACE_STD
    1. #include <stdio.h>
    2. #include <time.h>
    3. time_t time_test(void)
    4. {
    5. time_t t = 0;
    6. t = time(NULL);
    7. return t;
    8. }
    9. struct tm *gmttime_test(time_t *t)
    10. {
    11. struct tm *tm = NULL;
    12. tm = gmtime(t);
    13. return tm;
    14. }
    15. struct tm *localtime_test(time_t *t)
    16. {
    17. struct tm *tm = NULL;
    18. tm = localtime(t);
    19. return tm;
    20. }
    21. char *asctime_test(struct tm *tm)
    22. {
    23. char *char_time = {0};
    24. char_time = asctime(tm);
    25. return char_time;
    26. }
    27. char *ctime_test(time_t *t)
    28. {
    29. char *char_time = {0};
    30. char_time = ctime(t);
    31. return char_time;
    32. }
    33. int main(int argc, char *argv[])
    34. {
    35. time_t t = time_test();
    36. printf("time_test:%ld\n", t);
    37. struct tm *tm = gmttime_test(&t);
    38. //printf("%4d-%02d-%02d 02d:%02d:%02d %s\n", tm->tm_year + 1900, tm->tm_mon + 1,tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_zone);
    39. printf("asctime %s", asctime_test(tm));
    40. tm = NULL;
    41. tm = localtime_test(&t);
    42. //printf("%4d-%02d-%02d %02d:%02d:%02d %s\n", tm->tm_year + 1900, tm->tm_mon + 1,tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_zone);
    43. printf("ctime %s", ctime_test(&t));
    44. return 0;
    45. }

    执行结果:

     从执行结果可以看出:ctime()显示的是本地时间。两个函数返回的时间字符串还自带换行,所以不需要我们添加。

    1. /* Return the `time_t' representation of TP and normalize TP. */
    2. extern time_t mktime (struct tm *__tp) __THROW;

    该函数mktime()的功能与gmtime()和localtime()函数的功能刚好相反,是将struct tm转换为time_t;

    RTC与时间函数

    RTC时间是存放在CMOS中的时间,其中CMOS是一段非易失的介质,里面的内容是固定的,而这里的值会通过一个芯片按固定的时间修改,以保持时间的同步。time()函数的一个实现方式即为通过读取CMOS里的值,然后与Epoch时间做减法,得到的时间间隔再转化为秒数,即可作为返回值。

    关于时区Linux中有很多种方式来查看,例如:

     

  • 相关阅读:
    mysql解压版安装步骤linux
    【父母必知】呼吸过敏知多少
    RPA的优势和劣势是什么,RPA能力边界在哪里?
    还有人不知道?2022年湖北省商标品牌建设申报条件以及流程(附相关奖励扶持政策)
    CSS逻辑组合伪类
    三次握手四次挥手
    【c++5道练习题】①
    5+甲基化+预后模型搭配实验
    java报错Lock wait timeout exceeded或者很多事物僵死不执行的问题
    WPF入门教程系列二十八 ——DataGrid使用示例MVVM模式(6)
  • 原文地址:https://blog.csdn.net/hello_wordmy/article/details/125471670