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\n", 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\n", 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\n", 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中,並不會受其他線程的影響。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM