C语言中的时间转换

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;
}

时间转换常用时间格式

  1. 适合存储处理器时间的类型 clock_t
typedef long clock_t;
  1. 适合存储日历时间类型 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秒)起至现在的总秒数
  1. 用来保存时间和日期的结构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; /* 时区名称,根据系统不同可能不被声明或不同全名。 */
};

基本时间之间的转换

  1. 调用time()函数会得到kernel时间time()返回值为时间总秒数(前面提到了)
 time_t tNowUtc = time(NULL);
  1. time_t类型的时间转换为struct tm结构体,得到时间的详细信息
struct tm *gmtime(const time_t *timep);  // 得到UTC+0时区详细信息
struct tm *localtime(const time_t *timep);  // 得到本地时区时间详细信息
  1. 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);
  1. struct tm结构体转换为string
char *asctime(const struct tm *tm);
  1. struct tm 格式化成string(可按照自定义格式格式化) 具体格式化标准可查看strftime函数说明
size_t strftime (char* ptr, size_t maxsize, const char* format, const struct tm* timeptr );
  1. 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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值