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

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

修改代码如下:

  1.  1 hzsx@hzsx-server:~/file/test$ cat localtime.cpp 
  2.  2 #include <time.h>
  3.  3 #include <cstdio>
  4.  4 #include <cstdlib>
  5.  5 
  6.  6 using namespace std;
  7.  7 
  8.  8 int main(int argc, char *argv[])
  9.  9 {
  10.      time_t tNow =time(NULL);
  11.      time_t tEnd = tNow + ;
  12.      
  13.      //struct tm* ptm = localtime(&tNow);
  14.      //struct tm* ptmEnd = localtime(&tEnd);
  15.      struct tm ptm = {  };
  16.      struct tm ptmEnd = {  };
  17.      localtime_r(&tNow, &ptm);
  18.      localtime_r(&tEnd, &ptmEnd);
  19.      
  20.      char szTmp[] = {};
  21.      strftime(szTmp,,"%H:%M:%S",&ptm);
  22.      char szEnd[] = {};
  23.      strftime(szEnd,,"%H:%M:%S",&ptmEnd);
  24.      printf("%s \n",szTmp);
  25.      printf("%s \n",szEnd);
  26.      
  27.      return EXIT_SUCCESS;
  28.  }
  29.  hzsx@hzsx-server:~/file/test$ g++ -o localtime localtime.cpp       
  30.  hzsx@hzsx-server:~/file/test$ ./localtime                    
  31.  :: 
  32.  :: 
  33.  hzsx@hzsx-server:~/file/test$ 

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

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

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

  1.  1 #include <iostream>
  2.  2 #include <time.h>
  3.  3 #include <cstdlib>
  4.  4 #ifdef WIN32
  5.  5 #define LOCALTIME_R(tm,ti)  localtime_s(tm,ti)
  6.  6 #else
  7.  7 #define LOCALTIME_R(tm,ti)  localtime_r(ti,tm)
  8.  8 #endif
  9.  9 int main()
  10.  {
  11.          struct tm tmnow = {};
  12.          time_t long_time;
  13.          time(&long_time);
  14.          LOCALTIME_R(&tmnow,&long_time);
  15.          char buftime[];
  16.          strftime(buftime, , "time is : %Y-%m-%d %H:%M:%S", &tmnow);
  17.          std::cout << buftime << std::endl;
  18.          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. 在非MFC程序中引用CString

    CString在当今软件设计界里还是小有名气的,说它是MFC中使用的最多的类一点也不过,然而在使用sdk编windows程序的时候,确不能利用CString类,只能用sdk的运行时库,比如strlen ...

  2. Eclipse中查看Android模拟器SD卡目录

    · 有时候用到Android模拟器来模拟SD卡相关操作,在Eclipse中可以直接查看SD卡目录: 首先,新建模拟器的时候要创建SD卡,存储的大小根据需要创建: 启动模拟器,在Eclipse中打开视图 ...

  3. PHP设计模式浅析

    工厂模式 提到的最多, 用途也最广. 简单说就是: 定义一个用户创建对象的接口. 把创建对象的过程封装起来. 工厂类是指包含一个专门用来创建其他对象的方法的类,工厂类在多态性编程实践中是至关重要的,它 ...

  4. 使用LinkedList实现Stack与Queue

    LinkedList数据结构是一种双向的链式结构,每一个对象除了数据本身外,还有两个引用,分别指向前一个元素和后一个元素. 栈的定义栈(Stack)是限制仅在线性表的一端进行插入和删除运算.(1)通常 ...

  5. POJ2524——Ubiquitous Religions

    Ubiquitous Religions Description There are so many different religions in the world today that it is ...

  6. Revit 二次开发 沿弧形路径创建拉伸屋顶

    沿弧形路径创建拉伸屋顶 Revit的API中只能按照直线创建拉伸屋顶,不能按照曲线创建拉伸屋顶.在Revit的界面当中,可以用 构建->内建模型,进行放样创建屋顶.但是没有办法代码内建模型. 可 ...

  7. 如何解决MySQLAdministrator 启动报错

    运行环境:MySQL 5.1.41 win32 ZIP 非安装版MySQL GUI Tools 5.0(版本1.2.17.0) 运行MySQLAdministrator时提示:服务器服务或配置文件不能 ...

  8. 你想建设一个能承受500万PV/每天的网站吗?

    (如果感觉有帮助,请帮忙点推荐,添加关注,谢谢!你的支持是我不断更新文章的动力.本博客会逐步推出一系列的关于大型网站架构.分布式应用.设计模式.架构模式等方面的系列文章) 你想建设一个能承受500万P ...

  9. Windows 7/8 创建WIFI热点

    问题描述:很多人(特别是中国的大学生)都拥有一台联网的笔记本电脑,而手机使用的却是电信运营商提供的限制数量和速度的GPRS. 很多人不敢想象:联网的笔记本电脑能够将其流量以WiFi的形式共享出来供其它 ...

  10. js2word/html2word的简单实现

    js2word/html2word的简单实现 以C#描述如下:             StringBuilder sb = new StringBuilder();            sb.Ap ...