在做一个时间管理的APP中遇到一些问题
windows linux mac下time.h中都有关于localtime()的定义。
它不是一个保险可靠的方法,使用的时候需要小心。
参考 http://blog.csdn.net/maocl1983/article/details/6221810
在此对原作者表示感谢。
localtime是个静态的定义,每次得到同一个地址,
不保证得到真确的时间,看具体的代码:
 1 dev-mini:cronc devone$ cat localtime.cpp         
 2 #include <time.h>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 
 6 int main(int argc, char *argv[])
 7 {
 8     time_t tNow =time(NULL);
 9     time_t tEnd = tNow + ;
 
     struct tm* ptm = localtime(&tNow);
     struct tm* ptmEnd = localtime(&tEnd);
 
     char szTmp[] = {};
     strftime(szTmp,,"%H:%M:%S",ptm);
     char szEnd[] = {};
     strftime(szEnd,,"%H:%M:%S",ptmEnd);
 
     printf("%s \n",szTmp);
     printf("%s \n",szEnd);
 
     return EXIT_SUCCESS;
 }
 dev-mini:cronc devone$ g++ -o localtime localtime.cpp        
 dev-mini:cronc devone$ ./localtime                     
 :: 
 :: 
 dev-mini:cronc devone$ 

time_t 类型时间 + 1800 ,但是结果输出都是后者。

修改代码如下:

 1 hzsx@hzsx-server:~/file/test$ cat localtime.cpp 
 2 #include <time.h>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 
 6 using namespace std;
 7 
 8 int main(int argc, char *argv[])
 9 {
     time_t tNow =time(NULL);
     time_t tEnd = tNow + ;
     
     //struct tm* ptm = localtime(&tNow);
     //struct tm* ptmEnd = localtime(&tEnd);
     struct tm ptm = {  };
     struct tm ptmEnd = {  };
     localtime_r(&tNow, &ptm);
     localtime_r(&tEnd, &ptmEnd);
     
     char szTmp[] = {};
     strftime(szTmp,,"%H:%M:%S",&ptm);
     char szEnd[] = {};
     strftime(szEnd,,"%H:%M:%S",&ptmEnd);
     printf("%s \n",szTmp);
     printf("%s \n",szEnd);
     
     return EXIT_SUCCESS;
 }
 hzsx@hzsx-server:~/file/test$ g++ -o localtime localtime.cpp       
 hzsx@hzsx-server:~/file/test$ ./localtime                    
 :: 
 :: 
 hzsx@hzsx-server:~/file/test$ 

两段代码在linux和mac下通过。

localtime()函数是静态分配的,共享同一个结构体。所以下一次调用会覆盖上次的结果。
libc里提供了一个可重入版的函数localtime_r(),如同windows下的localtime_s(),这是一个
安全版本的函数。但是两者的参数位置正好相反。

下面这段代码 使用了安全版本的LOCALTIME_R(),在win linux mac下都具有通用性。

 1 #include <iostream>
 2 #include <time.h>
 3 #include <cstdlib>
 4 #ifdef WIN32
 5 #define LOCALTIME_R(tm,ti)  localtime_s(tm,ti)
 6 #else
 7 #define LOCALTIME_R(tm,ti)  localtime_r(ti,tm)
 8 #endif
 9 int main()
 {
         struct tm tmnow = {};
         time_t long_time;
         time(&long_time);
         LOCALTIME_R(&tmnow,&long_time);
         char buftime[];
         strftime(buftime, , "time is : %Y-%m-%d %H:%M:%S", &tmnow);
         std::cout << buftime << std::endl;
         return EXIT_SUCCESS;19 } 

localtime()方法的疑惑的更多相关文章

  1. Python time localtime()方法

    描述 Python time localtime() 函数类似gmtime(),作用是格式化时间戳为本地的时间.高佣联盟 www.cgewang.com 如果sec参数未输入,则以当前时间为转换标准. ...

  2. MapReduce 中job.setJarByClass()方法的疑惑

    在调试mr实例的时候,遇到如下的情况,如图所示 说明:就是我的mr程序类名称和我设置的setJarByclass()中设置的不一样,但是程序竟然没有报错!!!!当时把我吓尿了 疑惑:如果这样设置的话, ...

  3. 关于ArrayList 中子方法 -- contains 疑惑解决

    写之前先看下 ArrayList 子函数 contains 的Api 怎么介绍: boolean contains(Object o)           如果此列表中包含指定的元素,则返回 true ...

  4. Java基础:HashMap中putAll方法的疑惑

    最近回顾了下HashMap的源码(JDK1.7),当读到putAll方法时,发现了之前写的TODO标记,当时由于时间匆忙没来得及深究,现在回顾到了就再仔细思考了下 @Override public v ...

  5. python_way day18 html-day4, Django路由,(正则匹配页码,包含自开发分页功能), 模板, Model(jDango-ORM) : SQLite,数据库时间字段插入的方法

    python_way day18 html-day4 1.Django-路由系统   - 自开发分页功能 2.模板语言:之母板的使用 3.SQLite:model(jDango-ORM) 数据库时间字 ...

  6. Java中Set的contains()方法

    Java中Set的contains()方法 -- hashCode与equals方法的约定及重写原则 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashCode() a ...

  7. 洗礼灵魂,修炼python(40)--面向对象编程(10)—定制魔法方法+time模块

    定制魔法方法 1.什么是定制魔法方法 首先定制是什么意思呢?其实就是自定义了,根据我们想要的要求来自定义.而在python中,其实那些所谓的内置函数,内置方法,内置属性之类的其实也是自定义出来的,不过 ...

  8. python 方法调用

    获取当前时间 today=time.strftime('%Y-%m-%d',time.localtime(time.time())) 取得时间相关的信息的话,要用到python time模块,pyth ...

  9. 【Python044--魔法方法:简单定制】

    一.简单定制 基本要求: -- 定制一个计时器的类 -- start和stop代表开始计时和停止计时 -- 假设计时器对象t1,print(t1)和直接调用t1均显示结果 -- 当计时器未启动或停止计 ...

随机推荐

  1. 安卓 DevOps:从一次推送命令到生产

    DevOps 是一种广为人知的活动,其主要目的是使软件交付自动化.的确,DevOps 的目标是持续测试.代码质量.功能开发和更轻松地进行维护更新.因此,DevOps 的终极目标之一是让开发者可以执行快 ...

  2. 国外程序员整理的 C++ 资源大全

    摘要:C++是在C语言的基础上开发的一种集面向对象编程.泛型编程和过程化编程于一体的编程语言.应用较为广泛,是一种静态数据类型检查的,支持多重编程的通用程序设计语言. 关于 C++ 框架.库和资源的一 ...

  3. IsBadStringPtr、IsBadWritePtr

    判断调用进程是否拥有对指定字符串指针的读取权限,函数原型如下: BOOL IsBadStringPtr( LPCTSTR lpsz, UINT_PTR ucchMax); 参数: lpsz: 输入参数 ...

  4. POJ 2778 DNA sequence

    QAQ 做完禁忌 又做过文本生成器 这道题就是个水题啦 首先转移方程还是文本生成器的转移方程 但是注意到L很大,但是节点数很小 转移都是固定的,所以我们可以用AC自动机来构造转移矩阵 之后进行矩阵乘法 ...

  5. xcode 开发ios兼容性问题的上下黑边 和 coco2d-x 游戏分辨率适配 ResolutionPolicy::FIXED_WIDTH 都会引起上下黑边问题!!!

    1:Xcode6在iPhone5+iOS7模拟器上编译,上下有黑边问题 问题描述: Xcode6环境下,对iPhone5或iPhone5s模拟器,在iOS7或iOS7.1下运行,屏幕上下有黑边.在iO ...

  6. Linux 套接字编程中的 5 个隐患

    http://www.ibm.com/developerworks/cn/linux/l-sockpit/ 在 4.2 BSD UNIX® 操作系统中首次引入,Sockets API 现在是任何操作系 ...

  7. linux中class_create和class_register说明

    http://blog.csdn.net/angle_birds/article/details/16802099 本文介绍linux中class_create和class_register的相关使用 ...

  8. Android工具:延展图片NinePatch

    NinePatch能够对.png图片进行处理,生成一个.9.png格式的图片,图像拉伸操作时,图片就会有失真,而.9.png是Android里所支持的一种特殊的图片格式,可以实现部分拉伸. 制作图片方 ...

  9. Windows使用virtualenv搭建flask开发环境

    virtualenv: VirtualEnv用于在一台机器上创建多个独立的Python虚拟运行环境,多个Python环境相互独立,互不影响,它能够: 在没有权限的情况下安装新套件 不同应用可以使用不同 ...

  10. hdu4745Two Rabbits(dp)

    链接 哎..比赛中一下想到了公共子序 之后思维就被局限了 一直在这附近徘徊 想着怎么优化 怎么预处理.. 观看了众多神牛的代码 ..以前觉得自己能写出个记忆化的最长回文长度 还挺高兴的...现在觉得好 ...