本文最后由 森林生灵 于 2017/03/10 18:16:37 编辑
上节课老师留了一个问题,设计程序计算任意时间点间隔时间,想到每一年的月份天数不一样需要好多判断,感觉好复杂。但联想到前段时间写PHP时的时间处理用到了Unix时间戳,顿时来了灵感,利用Unix时间戳每一秒+1的特性,利用两个时间点的Unix时间戳的差来计算天数岂不是简单的多,而且可以精确到秒。
/** * Calculate any point in time intervals(UTC/GMT) * * @about Use UnixEpoch to calculate the time interval * @version 1.4(Visual C++ 6.0) * @date 2016-03-31 13:38:56 * @author 森林生灵 <admin@lanseyujie.com> * @link https://www.lanseyujie.com * @copyright Copyright(c) 2014-2018, lanseyujie.com * @license http://opensource.org/licenses/gpl-2.0.php GPL v2 or later */ #include <iostream> #include <time.h> #include <string.h> #include <stdlib.h> using namespace std; class UnixEpoch { private: int iY, iM, iD, iH, iMin, iS; public: long GetTick(char *str_time); void CalcTime(); }; //标准时间转换Unix时间戳 /*说明:Unix时间戳的0按照ISO 8601规范为:1970-01-01T00:00:00Z,即起始 时间只能从1970年1月1日0时0分0秒(UTC协调世界时/GMT格林尼治标准时间) 开始计算经过的秒数,不考虑闰秒。目前大多数的Unix系统中Unix时间戳存储 为32位,2038年会引发Y2038问题(千年虫危机)*/ long UnixEpoch::GetTick(char *str_time) { struct tm stm; memset(&stm, 0, sizeof(stm)); iY = atoi(str_time); iM = atoi(str_time + 5); iD = atoi(str_time + 8); iH = atoi(str_time + 11); iMin = atoi(str_time + 14); iS = atoi(str_time + 17); stm.tm_year = iY - 1900; stm.tm_mon = iM - 1; stm.tm_mday = iD; stm.tm_hour = iH; stm.tm_min = iMin; stm.tm_sec = iS; return mktime(&stm); } //处理时间数据 void UnixEpoch::CalcTime() { char str_time[19]; long tm_start,interval_day, interval_hour, interval_minute, interval_second; cout << "Please Input the Start Time!(eg.2011-12-31 11:43:07)" << endl; gets(str_time); //获取起始时间 cout << "UnixEpoch Start Time : " << GetTick(str_time) << endl; cout << "=====================================================" << endl; tm_start = GetTick(str_time) ; cout << "Please Input the End Time!(eg.2012-01-01 13:55:21)" << endl; gets(str_time); //获取截止时间 cout << "UnixEpoch End Time : " << GetTick(str_time) << endl; cout << "=====================================================" << endl; interval_day = GetTick(str_time) - tm_start; //计算时间间隔的秒数 cout << "Unix Time Interval : " << interval_day << endl; interval_second = (((interval_day % 86400) % 3600) % 60) / 1; //计算间隔时间余秒数 interval_minute = ((interval_day % 86400) % 3600) / 60; //计算间隔时间余分钟数 interval_hour = (interval_day % 86400) / 3600; //计算间隔时间余小时数 interval_day /= 86400; //计算间隔时间天数86400s = 24h * 60m * 60s = 1Day //倒序计算天/时分/秒是为了防止interval_day执行/=时被重新赋值 cout << "There Are " << interval_day << "Day(s)," << interval_hour << "Hour(s)," << interval_minute << "Minute(s)," << interval_second << "Second(s)" << " From The Time Point!" << endl; } int main() { system("color 0a"); UnixEpoch demo; demo.CalcTime(); //system("pause"); return 0; }
/** * Calculate any point in time intervals(UTC/GMT) * * @about Use UnixEpoch to calculate the time interval * @version 1.2(GNU GCC Compiler 6.2.0) * @date 2017-03-10 18:07:59 * @author 森林生灵 <admin@lanseyujie.com> * @link https://www.lanseyujie.com * @copyright Copyright(c) 2014-2018, lanseyujie.com * @license http://opensource.org/licenses/gpl-2.0.php GPL v2 or later */ #include <iostream> #include <sys/time.h> #include <stdio.h> #include <string> #include <cstring> #include <stdlib.h> using namespace std; class UnixEpoch { private: int iY, iM, iD, iH, iMin, iS; public: long GetTick(char *str_time); void CalcTime(); }; long UnixEpoch::GetTick(char *str_time) { struct tm stm; memset(&stm, 0, sizeof(stm)); iY = atoi(str_time); iM = atoi(str_time + 5); iD = atoi(str_time + 8); iH = atoi(str_time + 11); iMin = atoi(str_time + 14); iS = atoi(str_time + 17); stm.tm_year = iY - 1900; stm.tm_mon = iM - 1; stm.tm_mday = iD; stm.tm_hour = iH; stm.tm_min = iMin; stm.tm_sec = iS; return mktime(&stm); } void UnixEpoch::CalcTime() { char str_time[19]; long tm_start, tm_end, interval_day, interval_hour, interval_minute, interval_second; cout << "Please Input the Start Time (e.g.2011-12-31 11:43:05)!" << endl; cin.getline(str_time, 20, '\n'); tm_start = GetTick(str_time); cout << "UnixEpoch Start Time:" << tm_start << endl; cout << "====================================================" << endl; cout << "Please Input the End Time (e.g.2014-10-02 09:37:35)!" << endl; cin.getline(str_time, 20, '\n'); tm_end = GetTick(str_time); cout << "UnixEpoch End Time:" << tm_end << endl; cout << "====================================================" << endl; interval_day = tm_end - tm_start; interval_second = (((interval_day % 86400) % 3600) % 60) / 1; interval_minute = ((interval_day % 86400) % 3600) / 60; interval_hour = (interval_day % 86400) / 3600; interval_day /= 86400; cout << "There Are " << interval_day << "Day(s)," << interval_hour << "Hour(s)," << interval_minute << "Minute(s)," << interval_second << "Second(s)" << " From The Time Point!" << endl; } int main() { UnixEpoch demo; demo.CalcTime(); return 0; }
本文标题:C++利用Unix时间戳计算任意时间点时间间隔
版权声明:本文使用「署名 4.0 国际」创作共享协议,转载或使用请遵守署名协议。
相关文章
上一篇:最后的告别