純C/C++ 取得/計算系統時間 [CB_GET_Time]
純C/C++ 取得/計算系統時間 [CB_GET_Time]
GITHUB: https://github.com/jash-git/CB_GET_Time.git
CODE:
#include <time.h> #include <stdio.h> #include <string.h> /* 系統起始計算年份常數定義 */ #define GRTC_DATE_SINCE_YEARS 2015 /* 每一年天數常數定義 */ #define GRTC_TIME_DAY_PER_YEARS 365 /* 每小時分鐘數常數定義 */ #define GRTC_TIME_HOURS_PER_DAY 24 /* 每小時分鐘數常數定義 */ #define GRTC_TIME_MINUTES_PER_HOUR 60 /* 每分鐘秒數常數定義 */ #define GRTC_TIME_SECONDS_PER_MINUTE 60 /* 每小時秒數常數定義 */ #define GRTC_TIME_SECONDS_PER_HOUR (GRTC_TIME_SECONDS_PER_MINUTE * GRTC_TIME_MINUTES_PER_HOUR) /* 每一天秒數常數定義 */ #define GRTC_TIME_SECONDS_PER_DAY (GRTC_TIME_SECONDS_PER_HOUR * GRTC_TIME_HOURS_PER_DAY) /* 時間資料結構定義宣告 */ typedef struct _GRTC_LOCAL_TIME_DATAGRAM_STRUCTURE { /* Time */ int iSecond; /* Seconds: 0-59 */ int iMinutes; /* Minutes: 0-59 */ int iHours; /* Hours since midnight: 0-23 */ /* Date */ int iMDay; /* Day of the month: 1-31 */ int iMonths; /* Months *since* january: 0-11 */ int iYears; /* Years *since* 2015 */ } GRTCLOCALTIME, *LPGRTCLOCALTIME; /* 時間資料宣告 */ static GRTCLOCALTIME g_gltGRTCLocalTime; /* 一年中每經過一個月所累積之天數列表 */ static const int g_iGRTCMonthElapsedDayList[13] = { /*-----------------------------------------*/ /* 列表 */ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365, }; /*---------------------------------------------------------------------------*/ /* 取得系統時間 (2015/01/01-00:00:00 起至當下總秒數) */ long GRTCGetTime(GRTCLOCALTIME *lpLocalTime) { int iMDay, iYears, iMonths, iHours, iMinutes, iSecond; long lTotalDays, lTotalSecond; /* 如果沒有指定時間資料結構 */ if(lpLocalTime == NULL) { struct tm *lpSystemDatetime; time_t stmiSystemSeconds; /* 直接由系統取得當前時間 */ stmiSystemSeconds = time(NULL); lpSystemDatetime = localtime(&stmiSystemSeconds); /* 修正數據,並指派到計算用變數 */ iYears = lpSystemDatetime->tm_year; iMonths = lpSystemDatetime->tm_mon; iMDay = lpSystemDatetime->tm_mday; iHours = lpSystemDatetime->tm_hour; iMinutes = lpSystemDatetime->tm_min; iSecond = lpSystemDatetime->tm_sec; } /* 指定了時間資料結構 */ else { /* 修正數據,並指派到計算用變數 */ iYears = lpLocalTime->iYears; iMonths = lpLocalTime->iMonths; iMDay = lpLocalTime->iMDay; iHours = lpLocalTime->iHours; iMinutes = lpLocalTime->iMinutes; iSecond = lpLocalTime->iSecond; } /* 計算總天數 */ lTotalDays = (long)(g_iGRTCMonthElapsedDayList[iMonths] + (iMDay - 1) + (iYears * GRTC_TIME_DAY_PER_YEARS)); /* finally seconds */ lTotalSecond = (((((lTotalDays * GRTC_TIME_HOURS_PER_DAY) + iHours) * GRTC_TIME_MINUTES_PER_HOUR) + iMinutes) * GRTC_TIME_SECONDS_PER_MINUTE) + iSecond; return lTotalSecond; } /*---------------------------------------------------------------------------*/ /* 取得本地時間 */ GRTCLOCALTIME *GRTCGetLocalTime(long *lpSeconds) { long lTotalSeconds, lSecondRemainder; long lDays, lYears, lMonths; /* 如果沒有指定時間參數 */ if(lpSeconds == NULL) { /* 直接取當前系統時間進行處理 */ lTotalSeconds = GRTCGetTime(NULL); } else { lTotalSeconds = *lpSeconds; } /* 計算並修正天數值 */ lDays = (lTotalSeconds / GRTC_TIME_SECONDS_PER_DAY); lSecondRemainder = (lTotalSeconds % GRTC_TIME_SECONDS_PER_DAY); while(lSecondRemainder < 0) { lSecondRemainder += GRTC_TIME_SECONDS_PER_DAY; lDays --; } while(lSecondRemainder >= GRTC_TIME_SECONDS_PER_DAY) { lSecondRemainder -= GRTC_TIME_SECONDS_PER_DAY; lDays ++; } /* 產生時、分、秒欄位 */ g_gltGRTCLocalTime.iHours = (lSecondRemainder / GRTC_TIME_SECONDS_PER_HOUR); lSecondRemainder %= GRTC_TIME_SECONDS_PER_HOUR; g_gltGRTCLocalTime.iMinutes = (lSecondRemainder / GRTC_TIME_SECONDS_PER_MINUTE); g_gltGRTCLocalTime.iSecond = (lSecondRemainder % GRTC_TIME_SECONDS_PER_MINUTE); /* 年月日計算 */ lYears = GRTC_DATE_SINCE_YEARS; while((lDays < 0) || (lDays >= GRTC_TIME_DAY_PER_YEARS)) { /* 訂定一年是 GRTC_TIME_DAY_PER_YEARS 天數 */ long lYearsGuess = lYears + ((lDays / GRTC_TIME_DAY_PER_YEARS) - ((lDays % GRTC_TIME_DAY_PER_YEARS) < 0)); /* 修正天數 */ lDays -= ((lYearsGuess - lYears) * GRTC_TIME_DAY_PER_YEARS); lYears = lYearsGuess; } /* 產生年份欄位 */ g_gltGRTCLocalTime.iYears = (lYears - GRTC_DATE_SINCE_YEARS); /* 查表搜尋並計算月份與日期 */ lMonths = lYears; for(lMonths = 11; lDays < g_iGRTCMonthElapsedDayList[lMonths]; lMonths --) continue; lDays -= g_iGRTCMonthElapsedDayList[lMonths]; /* 產生月份與日期欄位 */ g_gltGRTCLocalTime.iMonths = lMonths; g_gltGRTCLocalTime.iMDay = (lDays + 1); return &g_gltGRTCLocalTime; } int main(void) { GRTCLOCALTIME gltLocalTime, *lpLocalTime = NULL; long lTotalSecond; memset(&gltLocalTime, 0, sizeof(GRTCLOCALTIME)); gltLocalTime.iYears = 0; gltLocalTime.iMonths = 9; gltLocalTime.iMDay = 14; lTotalSecond = GRTCGetTime(&gltLocalTime);//寫入 日期變秒 ->/60->分 printf("lTotalSecond = %ld\n", lTotalSecond); lTotalSecond=123456*60; lpLocalTime = GRTCGetLocalTime(&lTotalSecond);//讀取 分鐘*60->日期 printf("iYears = %d, iMonths = %d, iMDay = %d\n", lpLocalTime->iYears, lpLocalTime->iMonths, lpLocalTime->iMDay); return 0; }