time(), time_t, localtime(), localtime_r()的理解和用法

【C】localtime_r、localtime_s、localtime 三者的区别 和localtime都是用于将time_t转换为本地时间struct tm的函数,但它们在和localtime。 阅读详情

time_t的定义:

typedef __darwin_time_t	time_t; 
typedef long	__darwin_time_t;	/* time() */
从定义可以看出,timez_t实际上的数据类型是long。


time()

<pre name="code" class="objc">time_t time ( time_t * ptr_time );
 参数和返回值都是time_t object。 

如果参数为空,则返回当前时间距1970年1月1日00:00点 UTC的秒数;

<pre name="code" class="objc">    long secondsSince1970 = time(NULL);
    printf("It has been %ld seconds since 1970\n", secondsSince1970);
 

It has been 1413202571 seconds since 1970

如果参数不为空,此时返回值和参数都为当前时间距1970年1月1日00:00点 UTC的秒数。

time_t t;
time_t sec = 1000000000;
t = time(&sec);
printf("sec = %ld, t = %ld\n", sec, t);
 

sec = 1413202571, t = 1413202571

localtime()

struct tm * localtime ( const time_t * ptr_time );
 tm是一个包含了年月日时分秒的结构,定义如下: 

struct tm {
    int tm_sec; //seconds after the minute[0-60]
    int tm_min; //minutes after the hour[0-59]
    int tm_hour; //hours since midnight[0-23]
    int tm_mday; //day of the month[0-31]
    int tm_mon; //months since January[0-11]
    int tm_year; //years since 1900
    int tm_wday; //days since Sunday[0-6]
    int tm_yday; //days since January
    int tm_isdst; //Daylight Savings Time flag
    int tm_gmtoff; //offset from CUT in seconds
    char *tm_zone; //timezone abbreviation
};

 一般搭配time()函数使用,可以得到当前时间的年月日时分秒等。该函数所得时间为当前时区。 

 

    long secondsSince1970 = time(NULL);
    printf("It has been %ld seconds since 1970\n", secondsSince1970);
    
    struct tm now;
    localtime_r(&secondsSince1970, &now);
    printf("Current time is %d-%d-%d %d:%d:%d\n", now.tm_year + 1900, now.tm_mon + 1, now.tm_mday, now.tm_hour, now.tm_min, now.tm_sec);
 

It has been 1413203631 seconds since 1970

Current time is 2014-10-13 20:33:51

localtime_r()

struct tm *localtime_r(const time_t *restrict timer,
       struct tm *restrict result);
 由于localtime()是不重入的函数,因此是thread not safe的。如果多次调用这个函数,下一次返回的参数会把上一次返回的参数覆盖掉。。。就是说
struct tm* ptm = localtime(&tNow);  
struct tm* ptmEnd = localtime(&tEnd); 
 这里的ptm == ptmEnd 

还有同样碉堡功能的时间函数还有asctime(), ctime(), gmtime()
所以有了localtime_r()的存在,localtime()的可重入版本。当要多次使用的时候,最好用localtime_r()


参考文献:

http://www.codingunit.com/c-reference-time-h-structure-tm

http://pubs.opengroup.org/onlinepubs/009695399/functions/localtime.html

http://blog.youkuaiyun.com/markman101/article/details/7861415

C++时间处理实战:从time_t到localtime,掌握时间戳与日期转换 时间戳是计算机系统中表示时间点的核心概念,通常以自Unix纪元(1970年1月1日)以来的秒数存储。其原理是将连续的时间离散化为整数,便于存储、计算和跨平台交换。在C/C++编程中,标准库提供了`time()`函数获取当前时间戳,返回`time_t`类型值。这一基础机制为日志记录、性能分析和任务调度等场景提供了统一的时间基准。然而,将时间戳转换为人类可读的日期时间格式时,需使用`localtime()`函数进行转换,该函数会依据系统时区设置将UTC时间戳解析为包含年、月、日等字段的`tm`结构体。值得注意的 阅读详情

相关推荐

C++时间处理全解析:从time/localtime到线程安全与跨平台实践

在软件开发中,时间戳处理是基础且关键的技术环节,涉及系统时间获取、时区转换和格式化输出等核心概念。其原理基于计算机系统维护的纪元时间,通过标准库函数转换为人类可读的日历时间。掌握时间处理技术对日志记录、性能分析和任务调度等场景具有重要价值,能确保系统事件的准确排序和跨时区协同。本文聚焦C++中经典的time和localtime函数,深入探讨其线程安全隐患、跨平台差异及2038年问题等实际工程挑战,并提供封装方案与避坑指南,帮助开发者构建健壮的时间处理模块。

weixin_33980459的博客 352

C函数之localtime_r()

问题描述: localtime_r()函数在一个进程生命周期中,当系统time zone改变时,localtime_r()返回的时间与系统实际时间有误差 造成这个现象的原因: localtime_r不会使用系统time zone设定全局变量 tzname, timezone 和daylight的值,这三个变量被用来校正格林威治(UTC) 时间为本地时间。当系统time zone在进程周...

leesphone的专栏 9496

C语言time.h深度解析:从time_t到strftime的实战指南

在计算机编程中,时间处理是系统编程和嵌入式开发的基础核心。其原理基于Unix时间戳,即从协调世界时1970年1月1日开始的秒数累加,这为跨平台时间交换提供了统一标准。掌握这一原理的技术价值在于能够实现精确的日志记录、定时任务调度以及跨时区应用开发。在实际应用场景中,开发者常需将原始的time_t数值转换为人类可读的struct tm结构,并利用strftime函数进行灵活格式化。本文聚焦于C语言标准库time.h,深入剖析其数据结构与函数,特别是针对**struct tm**的易错字段(如从0开始的月份)和

weixin_34293141的博客 476

c++中的时间处理(1)localtime、localtime_r和localtime_s

localtime、localtime_r和localtime_s的使用。

3924

C语言time.h库深度解析:从time_t到strftime的实战指南

在系统编程和嵌入式开发中,时间处理是基础且关键的技术环节。其核心原理在于将时间抽象为两种表示形式:适合机器存储与计算的日历时间(如time_t类型,通常以自纪元起的秒数表示),以及适合人类理解的分解时间(如struct tm结构体)。这种设计实现了高效的时间运算与灵活展示的平衡,其技术价值在于提供了标准化、可移植的跨平台时间处理方案,广泛应用于日志记录、文件系统、定时任务和网络服务等场景。本文聚焦于C标准库中的time.h模块,深入剖析time_t与struct tm的转换机制,并重点详解strftime函

weixin_33404102的博客 301

揭秘无人机前沿领域的科技新突破

本文旨在系统性地介绍无人机技术在前沿领域的最新突破,涵盖从基础理论到实际应用的各个方面。我们将重点关注那些正在改变无人机行业面貌的关键技术创新,并分析它们对未来发展的影响。文章首先介绍无人机技术的基础概念和背景,然后深入探讨六个关键领域的技术突破,接着分析实际应用案例,最后展望未来发展趋势。自主导航系统(SLAM):同时定位与地图构建技术,使无人机能在未知环境中自主导航计算机视觉(CV):使无人机能够"看"和理解周围环境的技术5G通信:第五代移动通信技术,提供高速、低延迟的数据传输能源管理。

AI天才研究院 1490

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_tim...

木牛的博客 3772

通过CRC32爆破修改图片的宽高 ctf-misc图片隐写

** 一.在处理图片隐写题的时候,可能会修改图片原有的宽高,导致图片里面的内容无法正常显示,那么怎么判断它的宽高是否被修改了呢? ** 1.把图片拖进010editor中会发现左下角提示CRC不匹配,这是因为修改了高宽,却没有修改CRC,导致读取报错。 2.在linux中CRC32错误的图片是无法打开的,也可以利用pngcheck检查图片,会提示CRC32校验错误 ** 二.既然知道了CRC校验码错误,那么如何修改呢? 首先我们要知道CRC32是有哪些字节构成的 ** PNG文件中总是以固定的八个字节开

weixin_44145452的博客 1万+

localtime和localtime_r

C:时间函数 localtime localtime_r

liuyuedechuchu的博客 3936

ESP32+micro-ROS机器人开发实战:轻量级ROS2嵌入式集成

ROS2是现代机器人软件栈的核心框架,其基于DDS的分布式通信与QoS保障能力为多节点协同提供基础支撑;而micro-ROS作为专为微控制器优化的ROS2兼容中间件,解决了资源受限设备(如ESP32)接入ROS2生态的关键难题。其通过分层架构将DDS通信下沉至上位机Agent,使MCU仅需运行轻量Client,大幅降低内存开销(实测<180KB)并保留标准ROS2接口语义。该方案广泛应用于教育机器人、移动底盘、传感器节点等嵌入式场景,尤其适合基于ESP-IDF开发的Wi-Fi/BLE物联网机器人系统。本文以

weixin_29025501的博客 400

工业组态软件Intouch(单机版)入门{第二篇}

第5步:*都装好之后,需要进行测试授权是否生效,测试1:能否正常运行项目和编辑项目(能否编辑项目,取决于你的授权是否包含开发功能,如果只是单一的runtime授权,则只能运行项目,不能编辑项目)。在线第3步:点击第一个框右边的按钮,弹出文件浏览窗口,选中你的XMl授权文件,打开,然后你的授权出现在下方的列表中,勾选你的授权,然后点击Activate,等待几秒,授权就会出现在管理器页面的列表中,并且Status会显示Activated。第1步:软件安装好之后,先要配置好授权服务器。等待几秒,激活完成。

weixin_41571357的博客 1万+

linux C 下的时间函数localtime_r()、gettimeofday()、time()、ctime_r()等时间函数总结

总论点:掌握这7个函数可以解决一般linux c时间编程问题。 1、 7个重要函数说明对比 a、gettimeofday(struct timeval *tv, NULL) 相比time_t time(time_t *timep)可以获得微妙,都可以获得当前时间的总秒数。 time_t mktime(struct tm tmp) 可以获得struct tm结构体指针的总秒数。 b、asctime_...

zkkdcs1的博客 1万+

03 Aras Innovator二次开发-服务端方法(二)

Aras Innovator二次开发-服务端方法书写

企业信息化(PLM,ERP.MES) 2017

C语言时间处理全解析:从time()到clock_gettime()的高精度实践

时间处理是计算机系统编程的基础概念,其核心在于将物理时间转换为计算机可处理的数字表示。原理上,系统通过硬件时钟和操作系统维护的时间子系统,将时间量化为自特定纪元(如Unix Epoch)以来的计数单位。这一机制的技术价值在于为程序提供了感知和记录事件顺序、实现定时调度、进行性能分析的能力,是构建可靠、可观测系统的基石。应用场景广泛覆盖日志记录、任务调度、性能监控、分布式系统同步等领域。本文聚焦C语言环境,深入探讨如何通过标准库函数如`time()`和`localtime()`获取与转换时间,并进一步解析如何

weixin_34060741的博客 343

基于 MFC 和 C++ 的语音识别客户端实现方案

语音 SDK:[Microsoft Speech SDK](https://learn.microsoft.com/zh-cn/azure/cognitive-services/speech-service/speech-sdk)(建议使用最新版)1. **Azure 语音服务密钥**:需要在 [Azure 门户](https://portal.azure.com/) 中创建语音资源,获取密钥和区域(如 `eastasia`),替换代码中的占位符。

寒寒豆豆软件公司的博客 156

顶级AI大模型白嫖ChatGPT Plus1个月,0成本薅顶配功能

Chat*** Plus限时免费1个月!原价20美元/月的顶配功能

BUG猿的博客 7286

Linux C编程时间获取全解析:从time()到clock_gettime()的实战指南

在计算机编程中,时间处理是基础且关键的技术概念,它涉及系统调用、时钟源和数据结构等核心原理。理解时间获取机制对于确保程序逻辑正确性和数据一致性具有重要技术价值,尤其在日志记录、性能分析和分布式系统等应用场景中。本文将深入探讨Linux C环境下时间操作的实现细节,涵盖从经典的time()函数到高精度的clock_gettime()方法,并解析时间格式转换与线程安全处理。通过掌握这些技术,开发者能够编写出健壮可靠的代码,有效应对时区处理和多线程环境下的常见陷阱。

weixin_30753873的博客 398

ROS Motion Planning运动规划库安装方法及进阶使用方法详细介绍

​今天偶然发现了一个优质的运动规划库:ai-winter/ros_motion_planning,比较适合从事ROS移动机器人运动规划研究领域的小伙伴学习和使用,相比于莱斯大学Kavraki实验室提供的开源的著名运动规划库OMPL、或着我之前介绍过的zhm-real开源的zhm-real/MotionPlanning和zhm-real/PathPlanning运动规划库,今天介绍的ROS Motion Planning运动规划库与ROS机器人中常用的Navigation导航框架的兼容性更好,库中的运动规划

慕羽★的博客 5578

linux时间类型localtime_r

linux时间类型localtime_r,struct tm *p gettimeofday(&amp;now ,NULL);取得当前时间的参数值,now可以是struct timespec 或者 struct timeval 类型的。  mktime函数原型: 定义函数    time_t mktime(struct tm * timeptr);  函数说明    mktime()用来...

lemontree1945的博客 3203

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

localtime_r时区陷阱与C语言时间处理安全实践

在C语言编程中,时间处理是基础但易错的技术点。时间转换的核心原理是将Unix时间戳转换为可读的本地时间,这依赖于系统的时区设置。标准库函数localtime因其使用静态缓冲区而存在线程安全和可重入性问题,可能导致数据竞争甚至死锁。其线程安全版本localtime_r通过由调用者提供缓冲区解决了并发访问问题,但引入了更隐蔽的时区依赖陷阱——它依赖全局环境变量TZ和系统时区文件,在容器化部署和长期运行进程中可能因时区设置变化或缓存初始化顺序导致错误。从工程实践角度,理解时区环境变量的全局影响、掌握tzset的显

weixin_34221073的博客 390

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

仅剩3种正确方式:实现C语言time_t与struct tm安全转换的技术方案

掌握C语言time_t与struct tm转换的3种安全方法,解决跨平台时间处理难题。涵盖gmtime、localtime及可重入函数应用,避免常见线程安全问题。高效可靠,适用于日志系统与时间计算场景,值得收藏。

GatherTide的博客 650

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

localtime 和 localtime_r

[c-sharp] view plaincopy #include    #include    #include    #include       using namespace std;      int main(int argc, char *argv[])   {       time_t tNow =time(NULL);      

a_tu_的专栏 645

time 格式化 linux,Linux下的Time处理

HTTP协议中,有很多机制都和Time有关,这里先撇开缓存控制及过期机制,就拿Date开刀。Date的格式大致如下:Tue, 21 Jul 2015 21:19:41 GMT好,现在问题就来了,如何得到这个字符串?先别急,本文将会对Linux下Time的格式化以及转换做一下解读。0x00 一切的起点——time_t从某个纪元开始time_t这个概念就存在了,这里不谈什么历史故事,感兴趣的可以自行w...

weixin_42667269的博客 378

Linux C时间编程:从time()到clock_gettime()的实战指南

在Linux系统编程中,时间处理是基础且关键的技术环节。其核心原理涉及系统时钟、时区转换和精度控制等多个层面。从技术价值看,正确的时间操作能确保日志记录、性能分析和分布式系统同步的准确性。应用场景广泛,包括日志系统、性能剖析工具和跨时区应用开发。本文聚焦Linux C编程中的时间获取,深入解析time()、localtime()和clock_gettime()等函数的使用技巧与陷阱,特别强调线程安全和单调时钟的重要性,帮助开发者避免常见错误,提升代码健壮性。

weixin_34080951的博客 446

关于localtime()函数在多线程中的core问题

生产上的程序在某天运行的过程中忽然core掉,gdb显示的core文件的堆栈信息如下: (gdb) where  #0  0x0000003369832925 in raise () from /lib64/libc.so.6 #1  0x0000003369834105 in abort () from /lib64/libc.so.6 #2  0x0000003369870837 in

我是小慧慧 3020
下一篇: 如何用Cocoapods创建一个开源库
橘子安
博客等级 码龄19年 1粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值