本文探讨了C/C++中对日期和时间操作所用到的常用功能,并以大量的实例向你展示了#include <ctime>头文件中声明的各种函数和数据结构的详细使用方法.

基本概念的理解:

Coordinated Universal Time(UTC):世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT)比如,中国内地的时间与UTC的时差为东八区,表示为:UTC+8

Calendar Time:日历时间,表示从1970年1月1日0时0点到现在所经过的时间秒数,日历时间是相对时间,无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的.

epoch:英文武译为(新纪元;新时代;时间上的一点),在标准C/C++中是一个整数,它用此时的时间和标准时间点相差的秒数(即日历时间)来表示

一、与日期和时间相关的数据结构

在标准C/C++中,我们可通过tm结构来获得日期和时间,tm结构在ctime头文件中的定义如下:

#ifndef _TM_DEFINED

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日,以此类推 */

};

#define _TM_DEFINED

#endif

日历时间(Calendar Time)是通过 time_t 数据类型来表示的,用time_t表示的时间(日历时间)是从一个时间点(例如:1970年1月1日0时0分0秒)到此时的秒数在ctime中,我们也可以看到time_t是一个长整型数:

#ifndef _TIME_T_DEFINED

typedef long time_t;              /* 时间值 */

#define _TIME_T_DEFINED             /* 避免重复定义 time_t */

#endif

在ctime头文件中,我们可能会看到一些常用函数,它们都是以time_t为参数类型或返回值类型的函数:

double difftime(time_t time1, time_t time0);    //计算两个时间点之间的差值

time_t mktime(struct tm * timeptr);                 //把结构化时间转化为日历时间,即一个长整数

time_t time(time_t * timer);                            //通过参数timer获得指定日历时间,参数为NULL,代表当前时间

char * asctime(const struct tm * timeptr);      //得到固定的时间格式

char * ctime(const time_t *timer);                  //得到固定的时间格式

struct tm * gmtime(const time_t *timer);        //把日历时间转化为结构化时间

struct tm * localtime(const time_t * timer);    //把日历时间转化为结构化时间(针对本地的)

二、与日期和时间相关的函数及应用

在本节,我将向大家展示上面七个常用函数的使用例子。

1. 获得日历时间

我们可以通过time()函数来获得日历时间(Calendar Time),其原型为:time_t time(time_t * timer);

如果你已经声明了参数timer,你可以从参数timer返回现在的日历时间,同时也可以通过返回值返回现在的日历时间,即从一个时间点(例如:1970年1月1日0时0分0秒)到现在此时的秒数如果参数为空(NULL),函数将只通过返回值返回现在的日历时间,比如下面这个例子用来显示当前的日历时间:

#include <iostream>

#include <iomanip>

#include <ctime>

#include <string>

using namespace std;

int main(int argc,char *argv[]){

time_t it = time(NULL);

cout << "the calendar time now is :" << it << endl;

return 0;

}

运行的结果与当时的时间有关,我当时运行的结果是:

The Calendar Time now is 1295939665

其中1295939665就是我运行程序时的日历时间即从1970年1月1日0时0分0秒到此时(2011-01-25 15:33)时的秒数

2 获得日期和时间

这里说的日期和时间就是我们平时所说的年月日时分秒等信息,这里我们将一个日历时间保存为一个tm结构的对象. 其中可以使用的函数是gmtime()localtime(),这两个函数的原型为:

struct tm * gmtime(const time_t *timer);

struct tm * localtime(const time_t * timer);

其中gmtime()函数是将日历时间转化为世界标准时间(即格林尼治时间),并返回一个tm结构体来保存这个时间,而localtime()函数是将日历时间转化为本地时间,比如现在用gmtime()函数获得的世界标准时间是2011年1月25日15点33分22秒,那么我用localtime()函数在中国地区获得的本地时间会比世界标准时间晚8个小时,即2011年1月25日23点33分22秒,下面是个例子:

#include <iostream>

#include <iomanip>

#include <ctime>

#include <string>

using namespace std;

int main(int argc,char *argv[]){

time_t it = time(NULL);

struct tm *nowTime;

struct tm *local;

nowTime = std::gmtime(&it);

local = std::localtime(&it);

cout << "Local hour is: " << (local->tm_hour)<< endl;

cout << "UTC hour is: " << (nowTime>tm_hour)<< endl;

return 0;

}

运行结果是:

Local hour is: 23

UTC hour is: 15

3 固定的时间格式

我们可以通过asctime()函数和ctime()函数将时间以固定的格式显示出来,两者的返回值都是char*型的字符串,返回的时间格式为:

星期几 月份 日期 时:分:秒    年   \n\0

Wed   Jan   02   02:03:55 1980 \n\0

char * asctime(const struct tm * timeptr);

char * ctime(const time_t *timer);

其中asctime()函数是通过tm结构来生成具有固定格式的保存时间信息的字符串,而ctime()是通过日历时间来生成时间字符串,这样的话,asctime()函数只是把tm结构对象中的各个域填到时间字符串的相应位置就行了,而ctime()函数需要先参照本地的时间设置,把日历时间转化为本地时间,然后再生成格式化后的字符串,示例:

#include <iostream>

#include <iomanip>

#include <ctime>

#include <string>

using namespace std;

int main(int argc,char *argv[]){

time_t it = time(NULL);

struct tm *local;

local = std::localtime(&it);

std::string str(std::asctime(local));

std::string cstr(std::ctime(&it));

cout << "the current time: " << str << endl;

cout << "the c-current time: " << cstr << endl;

return 0;

}

运行结果:

the current time: Tue Jan 25 15:14:25 2011

the c-current time: Tue Jan 25 15:14:25 2011

4 计算持续时间的长度

有时候在实际应用中要计算一个事件持续的时间长度,我们可以使用difftime()函数,但它只能精确到秒,该函数的定义如下:

double difftime(time_t time1, time_t time0);

虽然该函数返回的以秒计算的时间间隔是double类型的,但这并不说明该时间具有同double一样的精确度,这是由它的参数觉得的(time_t是以秒为单位计算的)比如下面一段程序:

#include <iostream>

#include <iomanip>

#include <ctime>

#include <string>

#include <windows.h>

using namespace std;

int main(int argc,char *argv[]){

time_t start = time(NULL);

Sleep(1000);

time_t end = time(NULL);

cout << "durition time: " << std::difftime(start,end) << endl;

return 0;

}

运行结果为:durition time:  1.000000 seconds.

可以想像,暂停的时间并不那么巧是整整1秒钟.

5 分解时间转化为日历时间

这里说的分解时间就是以年月日时分秒等分量保存的时间结构,在C/C++中是tm结构我们可以使用mktime()函数将用tm结构表示的时间转化为日历时间其函数原型如下:

time_t mktime(struct tm * timeptr);

其返回值就是转化后的日历时间这样我们就可以先制定一个分解时间,然后对这个时间进行操作了,下面的例子可以计算出1997年7月1日是星期几:

#include <iostream>

#include <iomanip>

#include <ctime>

#include <string>

using namespace std;

int main(int argc,char *argv[]){

time_t it = time(NULL);

struct tm *local;

local = std::gmtime(&it);

cout << "calendar time: " << std::mktime(local) << endl;

return 0;

}

运行结果:calendar time: 1295939665

6. 处定义输出时间格式

我们可以使用strftime()函数将时间格式化为我们想要的格式它的原型如下:

size_t  strftime(

char *str,

size_t maxsize,

const char *format,

const struct tm *timeptr

);

我们可以根据format指向字符串中格式命令把timeptr中保存的时间信息放在strDest指向的字符串中,最多向str中存放maxsize个字符,该函数返回向str指向的字符串中放置的字符数,format的格式描述如下:

%a      星期几的简写

%A      星期几的全称

%b      月分的简写

%B      月份的全称

%c      标准的日期的时间串

%C      年份的后两位数字

%d     十进制表示的每月的第几天

%D     月/天/年

%e      在两字符域中,十进制表示的每月的第几天

%F      年-月-日

%g      年份的后两位数字,使用基于周的年

%G     年分,使用基于周的年

%h      简写的月份名

%H     24小时制的小时

%I      12小时制的小时

%j      十进制表示的每年的第几天

%m    十进制表示的月份

%M    十时制表示的分钟数

%n     新行符

%p     本地的AM或PM的等价显示

%r     12小时的时间

%R    显示小时和分钟:hh:mm

%S    十进制的秒数

%t     水平制表符

%T    显示时分秒:hh:mm:ss

%u     每周的第几天,星期一为第一天 (值从0到6,星期一为0)

%U     第年的第几周,把星期日做为第一天(值从0到53)

%V     每年的第几周,使用基于周的年

%w    十进制表示的星期几(值从0到6,星期天为0)

%W   每年的第几周,把星期一做为第一天(值从0到53)

%x    标准的日期串

%X    标准的时间串

%y    不带世纪的十进制年份(值从0到99)

%Y   带世纪部分的十进制年份

%z,%Z 时区名称,如果不能得到时区名称则返回空字符

%%  百分号

示例代码如下:

#include <iostream>

#include <iomanip>

#include <ctime>

#include <string>

#include <windows.h>

using namespace std;

int main(int argc,char *argv[]){

time_t it = time(NULL);

struct tm *local;

local = std::gmtime(&it);

char cTime[200];

size_t size = strftime(cTime,sizeof(cTime),"%Y-%m-%d %X",local);

cout << "size: " << size << setw(5)<< cTime << endl;

time_t t = time(0);

char tmp[64];

strftime(tmp, sizeof(tmp), "%Y/%m/%d %X %A",localtime(&t) );

cout << tmp << endl;

return 0;

return 0;

}

输出结果为:

size: 192011-01-25 08:27:35

2011/01/25 16:27:35 Tuesday

今天就到此为止,上面的代码在 CDT+Mingw4.4 下调试。

ctime库函数的使用相关推荐

  1. 数据结构实验——模拟停车场

    问题描述 设停车厂只有一个可停放5辆汽车的狭长通道,且只有一个大门可供汽车进出.汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车 ...

  2. C语言库函数大全及应用实例二

                                                 [编程资料]C语言库函数大全及应用实例二 函数名: bioskey 功 能: 直接使用BIOS服务的键盘接口 ...

  3. linux下的c库函数大全

    linux下的c库函数大全,虽然没有函数描述,但是最起码可以知道分类,就可以去 man 了 Linux C函数库参考手册 第1章字符测试函数 isalnum(测试字符是否为英文字母或数字) isalp ...

  4. Turbo C 2.0、Borland C++库函数及用例

    Turbo C 2.0.Borland C++库函数及用例 字母A开头函数函数名: abort 功 能: 异常终止一个进程 用 法: void abort(void); 程序例: #include & ...

  5. C++ 关于日期时间(四)asctime/ctime/gmtime/time_t/tm

    time_t 用来存储从1970年到现在经过了多少秒,要想更精确一点,可以用结构struct timeval,它精确到微秒. tm结构 在time.h中的定义如下: struct tm {int tm ...

  6. TC2.0库函数清单

    TC2.0库函数清单 一 字符函数和字符串函数 ANSI C 标准要求在使用字符函数时包含ctype.h,使用字符串函数时包含头文件string.h. 1. 字符函数 (ctype.h) (1) is ...

  7. 【C语言】C语言库函数

    目录 前言 C语言常用的头文件 一.<stdio.h> 二.<ctype.h> 三.<time.h> 四.<match.h> 五.<string. ...

  8. ctime(ctime头文件的作用)

    C语言 ctime() 没有 #include 的写法,只有 #include ,time.h 是C语言里时间的库函数. ctime在C语言里,只是一个把日期和时间转换为字符串的函数.具体函数原型为: ...

  9. ctime()函数以及time()使用

    C 库函数 char *ctime(const time_t *timer) 返回一个表示当地时间的字符串,当地时间是基于参数 timer. 返回的字符串格式如下:Www Mmm dd hh:mm:s ...

最新文章

  1. Dubbo 和 HSF 在阿里的实践:携手走向下一代云原生微服务
  2. 在一个html加载多个echarts,Echarts一个页面加载多个图表及图表自适应
  3. flowable工作流_【程序源代码】Springboot开源工作流开发框架
  4. PyInstaller打包exe,打包出来的可执行程序在触屏版win10家庭版系统下报错Colud not find QtWebEngineProcess.exe
  5. 文件 在线压缩 技术
  6. mysql 只读账号_MySql主从复制,从原理到实践!
  7. 第10章 指针(二) 首地址----------指针
  8. 0.1uf与47uf并联_UF是什么形式?
  9. Linux网络协议栈(一)——Socket入门(1)
  10. 新版DevEco不用USB线下载程序
  11. PIE SDK矢量数据空间索引的创建
  12. 移动老总上厕所!!!让你爽歪歪!!
  13. 地图测量面积工具app_【第288期】GPS工具箱(GPS精准定位工具)
  14. 快速对二叉树和前中后序遍历的相互转化
  15. qq游戏大厅 android,手机QQ游戏大厅Android版正式发布
  16. 仿QQ和飞秋并支持语音视频白板屏幕共享的即时聊天软件
  17. Android APP程序更新报解析软件包时出现错误问题解决方法
  18. 让你快速掌握技巧,新手怎么做自媒体?分享6点干货知识
  19. 各大公司面试题(社招)
  20. 黑马程序员——面向对象(1)

热门文章

  1. 【原创】大叔问题定位分享(33)oozie提交任务报错ArithmeticException: / by zero
  2. 如何比较js 浮点数
  3. 微信小程序实现图片是上传、预览功能
  4. 洛谷 P3960 列队【线段树】
  5. MySQL中实现Oracle里面 rank()over ( PARTITION BY ORDER BY) 分类分组功能
  6. 分支-19. 阶梯电价
  7. smartarm3250 performance
  8. 笔迹鉴别(5) —— 笔迹判别
  9. 删除指定目录下的所有文件包括目录
  10. 枚举类型enum用法_Java枚举深度解读,看这篇就够了