一、三个概念:

(1)UTC/GMT:Coorainated Universal Time:它是一个标准,最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治平时,也即格林威治标准时间(Greenwich Mean Time,GMT),在大多数场合,UTC与GMT等同(只是GMT不再由科学界精确定义)。
:为描述方便,本文中将UTC与GMT等同。

(2)Local time:指相对于UTC/GMT时间的本地时间(时区转换)。比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。美国是UTC-5。

(3)Calendar time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。在计算机中是相对于时间点:1970年1月1日,来算的。

二、主要数据类型、结构及函数(头文件:<ctime> (或者 time.h))
(1)types:

time_t:time type,通常为整型值,表示自1970年1月1日00:00到现在所经过的秒数。
typedef long time_t

struct tm:time structure,该结构体包含了日历时间和日期,其中各成员详细信息如下:

注:1,tm_year是指自1900年后的个数,故要得出真正的年份,还有加上1900(即tm_year + 1900)。2,tm_isdst指夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。但中国不实行夏令时,即此处应该0.
(2)functions:(以下只挑选了几个有代表性的函数为的是理清思路,更多函数可参考C++手册)

函数名:time
原型:time_t  time (time_t*  timer):
功能:获取当前的日历时间。若 timer 为NULL,则返回日历时间;若timer非NULL则将获取的日历时间存于timer中。

函数名:gmtime:
原型:struct tm*  gmtime (const time_t*  timer);
功能:将time_t类型的日历时间转换为 tm 结构的UTC(GMT)时间。

函数名:localtime
原型:struct tm*  localtime (const  time_t*  timer);
功能:将time_t类型的日历时间转换为 tm 结构的 Local time(本地时间)。

函数名:ctime
原型:char*  ctime (const  time_t*  timer);
功能:将time_t类型的日历时间转换为适合人们阅读(human-readable)的字符串格式的时间。

函数名:mktime
原型:time_t  mktime (const struct tm*  timeptr);
功能:将tm结构体类型的时间转换为 time_t类型的时间

函数名:asctime
原型:char*  asctime (const struct tm*  timeptr);
功能:将tm结构体类型的时间转换为适合人们阅读的字符串格式的时间。

综上,可以发现时间的表示形式不外乎三种:time_t、strcut tm以及string(char*).


三、例子

#include<iostream>
#include<string>
#include<ctime>
using namespace std;
int main()
{time_t rawtime = time(NULL);cout<<"rawtime:"<<rawtime<<endl;struct tm localtm = *localtime(&rawtime);struct tm UTCtm = *gmtime(&rawtime);cout<<"----------UTC time VS local time-----------"<<endl; cout<<"tm_sec:   "<<localtm.tm_sec<<"          "<<UTCtm.tm_sec<<endl;cout<<"tm_min:   "<<localtm.tm_min<<"          "<<UTCtm.tm_min<<endl;cout<<"tm_hour:  "<<localtm.tm_hour<<"          "<<UTCtm.tm_hour<<endl;cout<<"tm_mday:  "<<localtm.tm_mday<<"          "<<UTCtm.tm_mday<<endl;cout<<"tm_mon:   "<<localtm.tm_mon+1<<"          "<<UTCtm.tm_mon+1<<endl;cout<<"tm_year:  "<<localtm.tm_year+1900<<"        "<<UTCtm.tm_year+1900<<endl;cout<<"tm_yday:  "<<localtm.tm_yday<<"         "<<UTCtm.tm_yday<<endl;cout<<"tm_isdst: "<<localtm.tm_isdst<<"           "<<UTCtm.tm_isdst<<endl;string cstime = asctime(&localtm);cout<<"string time:"<<cstime<<endl;time_t makeLocal = mktime(&localtm);cout<<"mktime (hours)local: "<<makeLocal/3600<<endl;time_t makeUTC = mktime(&UTCtm);cout<<"mktime (hours)UTC: "<<makeUTC/3600<<endl;return 0;
}

输出结果

注:由结果可知,local time(UTC+8)比UTC要大8个小时,而其他member均一样。

四、关于localtime的返回值的内存问题:

在执行localtime(或者是gmtime或者是mktime等)时,有一个小问题。注意到代码中的:

struct tm localtm =*localtime(&rawtime);
struct tm UTCtm = *gmtime(&rawtime);

当我们写成:
struct tm* localtmptr = localtime(&rawtime);
struct tm*UTCtmptr = gmtime(&rawtime);
则会出现问题,运行结果会发现又localtime和gmtime得出的时间值时一样的,它们之间并不相差8个小时。

为什么会这样呢?

通过man localtime命令,可以发现一些细节:

即 localtime(或者是gmtime或者是mktime)等,它们的返回值都是指向一个共享的静态存储区,该块内存可能会被后面的时间函数重写。故 若有时间函数连续出现时,应该直接返回该内存,而不是指向该内存的指针。
这样一来,每一个时间函数都会从静态存储区把自己的时间拷贝出来,存入自己的内存区。

C++时间函数----time相关推荐

  1. MySQL 学习笔记(3)— 字符串函数、数值函数、日期时间函数、流程函数、聚集函数以及分组数据

    1. 字符串函数 MySQL 的常用函数包括字符串函数.数值函数.日期时间函数.流程函数等. SELECT ascii("abc"),char(97),concat("h ...

  2. java调用系统时间函数_JAVA自学笔记:不使用系统函数来计算日期处于当年的第多少天...

    前段时间练习了一个求闰年的功能,现在就可以用上啦,这次写一个不借助类库的时间函数,利用基础代码写一个计算求日期处于当年的第多少天的函数. 虽然也有简单的方法,例如直接定义每月的天数累加,然后加上当月的 ...

  3. SqlServer时间函数的使用例子整理

    为什么80%的码农都做不了架构师?>>>    整理SqlServer2008的时间函数如下: 1.获取系统时间 select getdate(); --2012-05-06 22: ...

  4. Sql Server函数全解(四)日期和时间函数

    阅读目录 1.获取系统当前日期的函数getDate(); 2.返回UTC日期的函数UTCDATE() 3.获取天数的函数DAY(d) 4.获取月份的函数MONTH(d) 5.获取年份的函数YEAR(d ...

  5. PHP 中日期时间函数 date() 用法总结

    [导读] date()是我们常用的一个日期时间函数,下面我来总结一下关于date()函数的各种形式的用法,有需要学习的朋友可参考.格式化日期date() 函数的第一个参数规定了如何格式化日期 时间.它 ...

  6. php入门时间,php入门教程(二十一) php日期与时间函数

    本节内容: php日期与时间函数 PHP提供了很多的处理日期和时间的函数,包括time().date().mktime().checkdate().microtime().strtotime()等,详 ...

  7. python时间函数报错_python3中datetime库,time库以及pandas中的时间函数区别与详解...

    1介绍datetime库之前 我们先比较下time库和datetime库的区别 先说下time 在 Python 文档里,time是归类在Generic Operating System Servic ...

  8. mysql 时区与时间函数

    --在mysql中可以直接使用sleep()函数,sysdate函数返回的是执行到当前函数的时间,而now函数返回的是执行sql的时间 mysql> SELECT now(),SYSDATE() ...

  9. pg数据库生成随机时间_postgresql 时区与时间函数-阿里云开发者社区

    postgresql 时区与时间函数 rudygao 2016-02-03 1951浏览量 简介: --把时间戳转成epoch值 postgres=# select extract(epoch fro ...

  10. Sql server中时间函数用法详解

    SQL中的时间函数非常有用,特别是在我们进行初始赋值.复杂查询的时候,就显得特别方便. 1.获得系统当前时间 select getdate()  2.DateName ( datepart , dat ...

最新文章

  1. 基于 Java 2 运行时安全模型的线程协作--转
  2. 《Java从入门到放弃》框架入门篇:hibernate基本配置
  3. 第九十四期:GitHub 发布 2019 年年度报告
  4. WordPress博客主题KRATOS双栏响应式博客主题
  5. python多维数组初始化后赋值的问题
  6. Fiddler抓包详解
  7. VS2017 winform 打包(使用 Microsoft Visual Studio 2017 Installer Project)
  8. 集体智慧编程 - 读书笔记
  9. webpower携手穷游,解析大数据、营销智能化与用户的关系
  10. 音视频格式.mp4和编码格式MPEG4以及ffmpeg转码
  11. mysql schemata 链接_MYSQL联合注入
  12. 【groovy #1】groovy的相关知识
  13. linux大容量硬盘 克隆到小硬盘_clonezilla 不管用了,手动把 GPT 分区的 ubuntu14.04 从大硬盘克隆到小硬盘...
  14. OpenWrt U盘分区启动设置
  15. Vue使用百度分享,组件切换、销毁分享失效的解决办法
  16. crucible VS gerrit
  17. 干货满满:一位博士在华为的22年
  18. 抖音上的战斗力测试软件,抖音战斗力测试app
  19. 重尾(heavy-tailed)、肥尾(fat-failed)、长尾(long-tailed)、次指数(subexponential)
  20. Java反序列化json内存溢出_fastjson反序列化使用不当致使内存泄露

热门文章

  1. 暴力--建物流中转站
  2. BOS物流项目--问题汇总
  3. Linux中DNS服务
  4. [海军国际项目办公室]羽未
  5. Nodejs Request使用介绍
  6. 马士兵-郑金维—并发编程—5.线程池
  7. 手把手带大家搭建一台服务器(腾讯云为例)
  8. 3.Nacos一致性协议Raft
  9. 查询物流信息并筛选最后站点
  10. AI会让我们失业吗?