C语言关于时间转换的函数在头文件
<time.h>
和<sys/timeb.h>
中,其中<time.h>
中包含了各种操作时间和日期的函数,<sys/timeb.h>
中包换结构体timeb,可以用来获取ms级别的时间
获取时间间隔
可利用
<sys/timeb.h>
头文件中的两个结构体获取ms级的执行时间, 统计程序的时间复杂度
struct timeb {
time_t time; // 1970-01-01 00:00:00 UTC 起经过的时间,以秒为单位
unsigned short millitm; // 额外的毫秒数==微秒
short timezone; // 时区
short dstflag; // 使用夏令时 该值为非零
};
#include <iostream>
#include <sys/timeb.h>
using namespace std;
int main()
{
struct timeb tmStart,tmEnd;
ftime(&tmStart); // 开始计时
for(int i = 0; i < 65535; ++i);
ftime(&tmEnd); // 结束计数
// 得到ms级别时间间隔
int releasedTime = (tmEnd.time-tmStart.time)*1000 + (tmEnd.millitm-tmStart.millitm);
cout << "程序运行时间为 " << releasdTime << endl;
return 0;
}
// 利用c++11的chrono库求时间间隔
long fibonacci(unsigned n)
{
if (n < 2) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
#include <chrono>
int main()
{
auto start = std::chrono::steady_clock::now();
std::cout << "f(42) = " << fibonacci(42) << '\n';
auto end = std::chrono::steady_clock::now();
std::chrono::duration<double> elapsed_seconds = std::chrono::duration<double>(end - start);
std::cout << "elapsed time: " << elapsed_seconds.count() << "s\n";
return 0;
}
时间转换常用时间格式
- 适合存储处理器时间的类型
clock_t
typedef long clock_t;
- 适合存储日历时间类型
time_t
// 32位表现为long 64位中表现为long long
#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t;
#else
typedef __time64_t time_t;
#endif
time_t time(time_t *t) // 实质时表示一个总秒数
// 传入参数一般为NULL 得到的结果为格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数
- 用来保存时间和日期的结构
stutic tm
struct tm {
int tm_sec; /* 秒,取值范围(0~59),但当遇到闰秒时则会有60秒的取值。 */
int tm_min; /* 分钟数,取值范围(0-59) */
int tm_hour; /* 小时数,取值范围(0-23) */
int tm_mday; /* 当天在这个月中是第几天,取值范围(1-31) */
int tm_mon; /* 当前月份是第几个月,取值范围(0-11) */
int tm_year; /* 从1900年开始至今的年数,即(Year - 1900)的值 */
int tm_wday; /* 当天在本周是第几天,取值范围(0-6, Sunday = 0) */
int tm_yday; /* 当天在今年是第几天,取值范围(0-365, 1 Jan = 0) */
int tm_isdst; /* 夏令时标记,值大于0表示夏令时生效;等于0表示夏令时失效;小于0表示数据不可用。 */
char *tm_zone; /* 时区名称,根据系统不同可能不被声明或不同全名。 */
};
基本时间之间的转换
- 调用
time()
函数会得到kernel时间time()
返回值为时间总秒数(前面提到了)
time_t tNowUtc = time(NULL);
- time_t类型的时间转换为struct tm结构体,得到时间的详细信息
struct tm *gmtime(const time_t *timep); // 得到UTC+0时区详细信息
struct tm *localtime(const time_t *timep); // 得到本地时区时间详细信息
- struct tm结构体转换为time_t类型
time_t mktime(struct tm *tm);; // linux和window都有 本地时间转换位utc时间
static time_t _mkgmtime(struct tm* const _Tm); // windows下 utc时间转time_t时间类型的utc时间
static time_t mkgmtime(struct tm* const _Tm); // linux下 utc时间转time_t时间类型的utc时间
//当然 在linux下可以使用下面函数 效果相同 但不常用
time_t timelocal(struct tm *tm);
time_t timegm(struct tm *tm);
- struct tm结构体转换为string
char *asctime(const struct tm *tm);
- struct tm 格式化成string(可按照自定义格式格式化) 具体格式化标准可查看strftime函数说明
size_t strftime (char* ptr, size_t maxsize, const char* format, const struct tm* timeptr );
- time_t类型转string(固定格式)
char *ctime(const time_t *timep);
例子
本地时间转换为utc时间戳
time_t CTimer::GetUtcTime(int nDate, int nTime)
{
struct tm tmOuter = { nTime%100, (nTime/100)%100, nTime/10000, nDate%100,(nDate/100)%100-1, nDate/10000-1900 };
#ifdef WIN32 // Windows
return _mkgmtime(&tmOuter);
#else // linux
return timegm(&tmOuter);
#endif // WIN32
}
将上面代码格式化为字符串输出
string CTimer::GetUtcTimeStr(int nDate, int nTime)
{
time_t tUtc = CTimer::GetUtcTime(nDate, nTime);
char buf[64] = { 0 };
strftime(buf, sizeof(buf), "%Y-%m-%d %X", gmtime(&tUtc));
return string(buf);
}
得到本地日期和时间
int CTimer::GetLocalDateInt()
{
time_t tNowUTC = time(NULL);
struct tm* pLocalTime = localtime(&tNowUTC);
return ((pLocalTime->tm_year + 1900) * 10000 + (pLocalTime->tm_mon + 1) * 100 + pLocalTime->tm_mday);
}
int CTimer::GetLocalTimeInt()
{
time_t tNowUTC = time(NULL);
struct tm* pLocalTime = localtime(&tNowUTC);
return (pLocalTime->tm_hour * 10000 + pLocalTime->tm_min * 100 + pLocalTime->tm_sec);
}