zoukankan      html  css  js  c++  java
  • localtime、localtime_s、localtime_r的使用

    (1)localtime用来获取系统时间,精度为秒

    #include <stdio.h> 
    #include <time.h> 
     
    int main() 
    {
     
        time_t time_seconds = time(0);
        struct tm* now_time = localtime(&time_seconds);
     
        printf("%d-%d-%d %d:%d:%d
    ", now_time->tm_year + 1900, now_time->tm_mon + 1,
            now_time->tm_mday, now_time->tm_hour, now_time->tm_min,
            now_time->tm_sec);
    }

    函数原型为struct tm *localtime(const time_t * timep)

    需要包含头文件:#include <time.h>
    struct tm的结构为

      int tm_sec;       /* 秒 – 取值区间为[0,59] */
              int tm_min;       /* 分 - 取值区间为[0,59] */
              int tm_hour;      /* 时 - 取值区间为[0,23] */
              int tm_mday;     /* 一个月中的日期 - 取值区间为[1,31] */
              int tm_mon;       /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
              int tm_year;        /* 年份,其值等于实际年份减去1900 */
              int tm_wday;      /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
              int tm_yday;       /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
              int tm_isdst;      /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/

    localtimeshi 使用存在一些问题:

    坑1:连续使用localtime()

    连续使用localtime()的结果就是返回相同的时间,不会得到你想要的两个不同的时间。

    原因:localtime()返回id指针会指向一个静态变量的地址,所以你不管调几次都是返回该指针指向的区域,不会变的。

    解决方式:使用localtime_r()函数。据说localtime()是线程不安全的,而localtiem_r()是线程安全的。

    坑2:用int这个类型,代替了time_t类型

    比如我的例2。通常你不会得到你想要的值,尤其需要的是转换成字符串的值。调试时时间戳是对的,但是使用转换时间格式的函数后就会是一个特别不靠谱的时间。

    原因:就是定义的数据类型问题。time_t是64位的,int是32位的,而localtime()的入参是个地址。我们虽然不知道localtime()具体都干啥了,但是从结果来看,localtime()的某些处理过程一定是跟入参的位数相关的。

    解决方式:localtime()的入参一定要是time_t的,无论你是定义的还是强转的。

    (2)localtime_r也是用来获取系统时间,运行于linux平台下

    函数原型为struct tm *localtime_r(const time_t *timep, struct tm *result);

    #include <stdio.h>
    #include <time.h>
    
    int main()
    {
    time_t time_seconds = time(0);
    struct tm now_time;
    localtime_r(&time_seconds, &now_time);
     
    printf("%d-%d-%d %d:%d:%d
    ", now_time.tm_year + 1900, now_time.tm_mon + 1,
    now_time.tm_mday, now_time.tm_hour, now_time.tm_min, now_time.tm_sec);
    }

    (3)localtime_s也是用来获取系统时间,运行于windows平台下,与localtime_r只有参数顺序不一样

    #include <iostream>
    #include <time.h>
     
    int main()
    {
    time_t time_seconds = time(0);
    struct tm now_time;
    localtime_s(&now_time,&time_seconds);
     
    printf("%d-%d-%d %d:%d:%d
    ", now_time.tm_year + 1900, now_time.tm_mon + 1,
    now_time.tm_mday, now_time.tm_hour, now_time.tm_min, now_time.tm_sec);
    }

              为什么有了localtime还要有其他两个函数呢,因为localtime并不是线程安全的,观察localtime和localtime_r的调用发现,localtime在使用时,我们只需定义一个指针,并不需要为指针申请空间,而指针必须要指向内存空间才可以使用,其实申请空间的动作由函数自己完成,这样在多线程的情况下,如果有另一个线程调用了这个函数,那么指针指向的struct tm结构体的数据就会改变。

            在localtime_s与localtime_r调用时,定义的是struct tm的结构体,获取到的时间已经保存在struct tm中,并不会受其他线程的影响。

  • 相关阅读:
    !!!!Linux系统开发 系列 4 进程资源 环境 fork()子进程 wait() waitpid()僵尸 孤儿进程
    linux运维工程师
    C# CSGL
    C# 中的"yield"使用
    C#语法糖
    VS2017下Git的使用
    Oracle数据类型与.NET中的对应关系
    Java 8 Stream
    Java 8 默认方法
    Java 8 函数式接口
  • 原文地址:https://www.cnblogs.com/stonemjl/p/14087143.html
Copyright © 2011-2022 走看看