C++ 日期和时间的相关函数

C++ 标准库没有提供所谓的日期类型,头文件ctime提供了继承于 C 语言的日期和时间的结构和函数。

结构 tm 把日期和时间以 C 结构的形式保存,tm 结构的定义如下:

struct tm {
    int tm_sec;    // 秒,正常范围从 0 到 59,但允许至 61
    int tm_min;    // 分,范围从 0 到 59
    int tm_hour;   // 小时,范围从 0 到 23
    int tm_mday;   // 一月中的第几天,范围从 1 到 31
    int tm_mon;    // 一年中的第几月,范围从 0 到 11
    int tm_year;   // 自 1900 年起的年数
    int tm_wday;   // 一周中的第几天,范围从 0 到 6,从星期日算起
    int tm_yday;   // 一年中的第几天,范围从 0 到 365,从 1 月 1 日算起
    int tm_isdst;  // 夏令时
};

类型 clock_t、time_t 把系统时间和日期表示为整数类型;结构 timeval 把时间表示为长整型。

struct timeval
{
    long tv_sec;  //秒
    long tv_usec; //微秒
};

函数:time_t time(0);
功能:默认为自1970年1月1日到当前系统时间所经过的秒数,差值为秒数。

函数:clock_t clock();
功能:返回自程序启动起处理器时钟所使用的时间,差值为毫秒数 。

函数:double difftime(time_t time1, time_t time2);
功能:返回 time1 和 time2 之间的差值,可以用 time1-time2代替。

函数:unsigned int Sleep(unsigned int miliseconds);   //非<ctime>库函数
功能:执行挂起一段时间,也就是等待一段时间在继续执行。
注意:(1)Sleep是区分大小写的,有的编译器是大写,有的是小写。
   (2)Sleep括号里的unsigned型时间数,windows以毫秒为单位,而linux是以秒为单位。
   (3)头文件在windows里为<windows.h>,在linux里为<unistd.h>。

#include <iostream>
#include <ctime>
#include <windows.h>  //Sleep()

using namespace std;

int main(void)
{
	time_t now0 = time(0); 
	clock_t now1 = clock();
	
	Sleep(1499);  // 模拟一段程序在工作的时间
	
	time_t now2 = time(0); 
	clock_t now3 = clock();	
	
	cout<<"程序运行时间:"<<difftime(now2,now0)<<endl; 
	cout<<"程序运行时间:"<<difftime(now3,now1)<<endl;
	
	cout<<"程序运行时间:"<<now2-now0<<endl; 
	cout<<"程序运行时间:"<<now3-now1<<endl;
	
    return 0;
}

/*
程序运行时间:1
程序运行时间:1499
程序运行时间:1
程序运行时间:1499

--------------------------------
Process exited after 2.136 seconds with return value 0
请按任意键继续. . .
*/

函数:struct tm *localtime(const time_t *time);
功能:返回一个指向表示本地时间的 tm 结构的指针。

setw(int)、setfill(char) 设置宽度和填充字符,来自库<iomanip>,用于控制输出格式。

使用 tm 结构格式化时间:

#include <iostream>
#include <ctime>
#include <iomanip>
 
using namespace std;
 
int main( )
{
	time_t now = time(0);
	
	cout << "1970/01/01 00:00:00到当前经过秒数:"<<now<<endl;
	
	tm *ltm = localtime(&now);
	
	cout << "\n日期: "<< 1900 + ltm->tm_year << "年";
	cout << setw(2) << setfill('0') << ltm->tm_mon +1 << "月";
	cout << setw(2) << setfill('0') << ltm->tm_mday << "日" << endl;
	
	cout << "\n时间: ";
	cout << setw(2) << setfill('0') << ltm->tm_hour << ":";
	cout << setw(2) << setfill('0') << ltm->tm_min << ":";
	cout << setw(2) << setfill('0') << ltm->tm_sec << endl;

 	return 0;  
}

/*
执行结果: 

1970/01/01 00:00:00到当前经过秒数:1612144248

日期: 2021年02月01日

时间: 09:50:48

--------------------------------
Process exited after 1.033 seconds with return value 0
请按任意键继续. . .
*/

函数:char* ctime(const time_t *time);
功能:返回一个表示当地时间的字符串指针。

函数:char* asctime ( const struct tm *time );
功能:返回一个指向字符串的指针,字符串包含了 time 所指向结构中存储的信息。

函数:struct tm* gmtime(const time_t *time);
功能:返回一个指向 time 结构的指针,用协调世界时(UTC)表示。

#include <iostream>
#include <ctime>
 
using namespace std;
 
int main(void)
{
   time_t now = time(0);
   
   char* dt = ctime(&now);	// 把 now 转换为 char* 字符串形式
   
   string str(ctime(&now));	// 或者把 now 转换为 string 字符串形式
 
   cout << "本地日期和时间:" << str;

   tm *tm = gmtime(&now);	// 把 now 转换为 tm 结构
   dt = asctime(tm);
   
   cout << "UTC 日期和时间:"<< dt;
   
   /* 提示:ctime(), asctime()转换出的字串已包括\n */
   
   return 0;
}

/*
运行结果: 

本地日期和时间:Sat Jan 30 06:51:43 2021
UTC 日期和时间:Fri Jan 29 22:51:43 2021

--------------------------------
Process exited after 3.677 seconds with return value 0
请按任意键继续. . .
*/ 

UTC时间和本地时间(LocalTime)的区别

  世界协调时间(Universal Time Coordinated,UTC),GPS 系统中有两种时间区分,一为UTC,另一为LT(地方时)两者的区别为时区不同,UTC就是0时区的时间,(LocalTime)地方时为本地时间,如北京为早上八点(东八区),UTC时间就为零点,时间比北京时晚八小时,以此计算即可。UTC相当于本初子午线(即经度0度)上的平均太阳时,过去曾用格林威治平均时(GMT)来表示,北京时间比UTC时间早8小时,以2021年1月28日00:00UTC为例,UTC时间是零点,北京时间为2021年1月28日早上8点整。

函数:time_t mktime(struct tm *time);
功能:返回日历时间,相当于 time 所指向结构中存储的时间。

函数:size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr);
功能:格式化结构 timeptr 表示的时间,并把它存储在 str 中。
参数:str -- 这是指向目标数组的指针,用来复制产生的 C 字符串。
   maxsize -- 被复制到 str 的最大字符个数。
   format -- 包含了普通字符和特殊格式说明符的 C 字符串,这些格式说明符由函数替换为表示 tm 中所指定时间的相对应值。
   timeptr -- 指向 tm 结构的指针。
返回:如果产生的 C 字符串小于 size 个字符(包括空结束字符),则会返回复制到 str 中的字符总数(不包括空结束字符),否则返回零。

说明符替换为实例
%a缩写的星期几名称Sun
%A完整的星期几名称Sunday
%b缩写的月份名称Mar
%B完整的月份名称March
%c日期和时间表示法Sun Aug 19 02:56:02 2012
%d一月中的第几天(01-31)19
%H24 小时格式的小时(00-23)14
%I12 小时格式的小时(01-12)05
%j一年中的第几天(001-366)231
%m十进制数表示的月份(01-12)08
%M分(00-59)55
%pAM 或 PM 名称PM
%S秒(00-61)02
%U一年中的第几周,以第一个星期日作为第一周的第一天(00-53)33
%w十进制数表示的星期几,星期日表示为 0(0-6)4
%W一年中的第几周,以第一个星期一作为第一周的第一天(00-53)34
%x日期表示法08/19/12
%X时间表示法02:50:06
%y年份,最后两个数字(00-99)01
%Y年份2012
%Z时区的名称或缩写CDT
%%一个 % 符号%
#include <iostream>
#include <ctime>
#include <array>
 
using namespace std;
 
int main ()
{
	time_t ltm;
    struct tm *info;
    char buff[12];
    char datetime[20];
    array<string,7>weekday = {"日","一","二","三","四","五","六"};
 
    int year=2021, month=1, day=31; //或可由cin输入 
 
    time(&ltm);
    info = localtime(&ltm);
    info->tm_year = year - 1900;
    info->tm_mon = month - 1;
    info->tm_mday = day;
 
    mktime(info);  //调用 mktime: info->tm_wday
    cout<<"那天是星期"<<weekday.at(info->tm_wday)<<endl;
    
	strftime(buff, 12, "%Y-%m-%d", info);
	cout<<"那天的日期:"<<buff<<endl;
 
 	strftime(buff, 12, "%H:%M:%S", info);
	cout<<"现在当地时间:"<<buff<<endl;

    info = localtime(&ltm);
 	strftime(datetime, sizeof(datetime), "%Y-%m-%d %H:%M:%S", info);
	cout<<"当前日期时间:"<<datetime<<endl;
 
    return 0;
}

/*
运行结果: 

那天是星期日
那天的日期:2021-01-31
现在当地时间:11:20:45
当前日期时间:2021-01-31 11:20:45

--------------------------------
Process exited after 0.812 seconds with return value 0
请按任意键继续. . .
*/ 

 

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hann Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值