ISO8601和UTC 时间,由秒数转化日期时间,日期到秒数
ISO8601时间格式:2018-6-5T17:46:50Z
UTC时间格式: 2018-06-05T03:46:50+08:00 等同于2018-6-5T11:46:50Z
UTC+时区= localtime;
其中"T"用来分割日期和时间,时间后面跟着的"-07:00"表示西七区,"+08:00"表示东八区。
时区默认是0时区,可以用"Z"表示,也可以不写。
对于我国,要使用"+08:00",表示东八区。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include
#include
#ifdef WIN32
#include
#define snprintf sprintf_s
#else
#include
#endif
typedef struct dataTime_t
{
uint16_t wYear;
uint16_t wMonth;
uint16_t wDayOfWeek;
uint16_t wDay;
uint16_t wHour;
uint16_t wMinute;
uint16_t wSecond;
uint16_t wMilliseconds;
}dataTime_t;
/*
*获取系统ISO8601时间,字符串表示
*/
int GetDataTime_ISO8601(char * data, int size)
{
time_t time_utc;
struct tm tm_local;
time(&time_utc);
#ifdef WIN32
localtime_s(&tm_local, &time_utc);
#else
localtime_r(&time_utc, &tm_local);
#endif
int success = 0;
success = snprintf(data, size, "%04d-%02d-%02dT%02d:%02d:%02dZ",
tm_local.tm_year + 1900,
tm_local.tm_mon + 1,
tm_local.tm_mday,
tm_local.tm_hour,
tm_local.tm_min,
tm_local.tm_sec);
return success;
}
/*
*获取时区
*/
int GetTimeZone(int &nTimeZone)
{
struct tm tm_local;
time_t time_utc;
// Get the UTC time
time(&time_utc); //当前时间的秒数
// Get the local time
// Use localtime_r for threads safe
#ifdef WIN32
localtime_s(&tm_local, &time_utc);
#else
localtime_r(&time_utc, &tm_local);
#endif
time_t time_local;
// Change tm to time_t
time_local = mktime(&tm_local);
struct tm tm_gmt;
// Change it to GMT tm
#ifdef WIN32
gmtime_s(&tm_gmt, &time_utc);
#else
gmtime_r(&time_utc, &tm_gmt);;
#endif
int time_zone = tm_local.tm_hour - tm_gmt.tm_hour;
if (time_zone < -12) {
time_zone += 24;
}else
if (time_zone > 12) {
time_zone -= 24;
}
nTimeZone = time_zone;
return time_zone;
}
/*
*ISO8601或者UTC格式的时间,将字符串时间转换为 dataTime_t对象
*/
int GetDataTime_ISO8601_UTC_DataTime(const char * lpStringdata, int nStringSize, dateTime_t *lpDataTime)
{
int lsuccess = 0;
//2018-06-01T08:32:56.000Z /2018-06-01T08:32:56Z
int lTimeZone = 0;
if (lpStringdata == NULL || nStringSize < 20 ) return -1;
char * lpSource = (char *)lpStringdata;
char lpdate[6] = { 0 };
strncpy(lpdate, lpSource, 4);
lpdate[4] = '\0';
lpDataTime->wYear = atoi(lpdate);
char *llpSource = lpSource + 5;
if (llpSource==NULL) return -1;
strncpy(lpdate, llpSource, 2);
lpdate[2] = '\0';
lpDataTime->wMonth = atoi(lpdate);
llpSource = llpSource + 3;
if (llpSource == NULL) return -1;
strncpy(lpdate, llpSource, 2);
lpdate[2] = '\0';
lpDataTime->wDay = atoi(lpdate);
llpSource = llpSource + 3;
if (llpSource == NULL) return -1;
strncpy(lpdate, llpSource, 2);
lpdate[2] = '\0';
lpDataTime->wHour = atoi(lpdate);
llpSource = llpSource + 3;
if (llpSource == NULL) return -1;
strncpy(lpdate, llpSource, 2);
lpdate[2] = '\0';
lpDataTime->wMinute = atoi(lpdate);
llpSource = llpSource + 3;
if (llpSource == NULL) return -1;
strncpy(lpdate, llpSource, 2);
lpdate[2] = '\0';
lpDataTime->wSecond = atoi(lpdate);
/*
* 2018-06-01T08:32:56Z
* 2018-06-01T08:32:56+08:00
* 2018-06-01T08:32:56.000Z
* 2018-06-01T08:32:56.000+08:00
*/
llpSource = llpSource + 2;
if (llpSource == NULL) return -1;
strncpy(lpdate, llpSource, 1);
lpdate[1] = '\0';
if (strcmp(lpdate, ".") == 0)
{
char *lpbuffer = llpSource + 1;
if (lpbuffer == NULL) return -1;
char buffer[4] = { 0 };
strncpy(buffer, lpbuffer, 3);
buffer[3] = '\0';
lpDataTime->wMilliseconds = atoi(buffer);
char * lptime = lpbuffer + 3;
char buf[6] = { 0 };
if (lptime == NULL) return -1;
strncpy(buf, lptime, 1);
buf[1] = '\0';
if (strcmp(buf, "+") == 0)
{
lptime = lptime + 1;
if (lptime == NULL) return -1;
strncpy(buf, lptime, 2);
buf[2] = '\0';
lTimeZone = atoi(buf);
}
}
if (strcmp(lpdate, "+") == 0)
{
llpSource = llpSource + 1;
if (llpSource == NULL) return -1;
strncpy(lpdate, llpSource, 2);
lpdate[2] = '\0';
lTimeZone = atoi(lpdate);
}
printf("time : %4d/%d/%d %2d:%d:%d.%3d + %d:00", lpDataTime->wYear, lpDataTime->wMonth, lpDataTime->wDay, lpDataTime->wHour, lpDataTime->wMinute, lpDataTime->wSecond,lpDataTime->wMilliseconds,lTimeZone);
/////////////////////////////////////////////////////////////////////////////////
return lsuccess;
}
/*
* 得到系统时间
*/
int GetLocalTime(dateTime_t *lpDateTime)
{
int32_t lsuccess = 0;
#ifdef WIN32
SYSTEMTIME *lpSystemTime = (SYSTEMTIME *)lpDataTime;
GetLocalTime(lpSystemTime);
#else
struct timeval nowTime = { 0 };
lsuccess = gettimeofday(&nowTime, 0);
time_t time = (time_t)nowTime.tv_sec;
struct tm ntm, *ptm = &ntm;
localtime_r(&time, &ntm);
lpDataTime->wYear = ptm->tm_year + 1900;
lpDataTime->wMonth = ptm->tm_mon + 1;
lpDataTime->wDayOfWeek = ptm->tm_wday;
lpDataTime->wDay = ptm->tm_mday;
lpDataTime->wHour = ptm->tm_hour;
lpDataTime->wMinute = ptm->tm_min;
lpDataTime->wSecond = ptm->tm_sec;
lpDataTime->wMilliseconds = nowTime.tv_usec / 1000;
#endif
return lsuccess;
}
/*
* 设置系统时间
*/
int SetLocalTime(dateTime_t *lpDateTime)
{
int32_t lsuccess = 0;
#ifdef WIN32
SYSTEMTIME *lpSystemTime = (SYSTEMTIME *)lpDataTime;
lsuccess = SetLocalTime(lpSystemTime);
#else
struct tm _tm = { 0 };
_tm.tm_sec = lpDataTime->wSecond;
_tm.tm_min = lpDataTime->wMinute;
_tm.tm_hour = lpDataTime->wHour;
_tm.tm_mday = lpDataTime->wDay;
_tm.tm_mon = lpDataTime->wMonth -1;
_tm.tm_year = lpDataTime->wYear - 1900;
struct timeval tv;
tv.tv_sec = mktime(&_tm);
tv.tv_usec = 0;
if (settimeofday(&tv, (struct timezone *) 0) < 0)
{
printf("Set system datetime error!\n");
return -1;
}
#endif
return lsuccess;
}
/*
* 设置系统时间
*/
int SetLocalTimeAddTZ(dateTime_t *lpDateTime, int ltimezone)
{
int32_t lsuccess = 0;
int llSecond = ltimezone * 3600;
struct tm _tm = { 0 };
_tm.tm_sec = lpDataTime->wSecond;
_tm.tm_min = lpDataTime->wMinute;
_tm.tm_hour = lpDataTime->wHour;
_tm.tm_mday = lpDataTime->wDay;
_tm.tm_mon = lpDataTime->wMonth -1;
_tm.tm_year = lpDataTime->wYear - 1900;
time_t timeSeconds = mktime(&_tm);
time_t CountSecond = timeSeconds + llSecond;
#ifdef WIN32
struct tm timer, *time = &timer;
localtime_s(time,&CountSecond);
lpDataTime->wYear = time->tm_year + 1900;
lpDataTime->wMonth = time->tm_mon +1;
lpDataTime->wDayOfWeek = time->tm_wday;
lpDataTime->wDay = time->tm_mday;
lpDataTime->wHour = time->tm_hour;
lpDataTime->wMinute = time->tm_min;
lpDataTime->wSecond = time->tm_sec;
SYSTEMTIME *lpSystemTime = (SYSTEMTIME *)lpDataTime;
avx_success = SetLocalTime(lpSystemTime);
printf("Time+TZ: %4d/%d/%d %2d:%d:%d\n", lpSystemTime->wYear, lpSystemTime->wMonth, lpSystemTime->wDay,
lpSystemTime->wHour, lpSystemTime->wMinute, lpSystemTime->wSecond);
#else
struct timeval tv;
tv.tv_sec = CountSecond;
tv.tv_usec = 0;
if (settimeofday(&tv, (struct timezone *) 0) < 0)
{
printf("Set system datatime error!\n");
return -1;
}
#endif
return lsuccess;
}
/*
* function :get current time
* out : Seconds/Millisecond
*/
int64_t SKY_GetUTCTime()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
}
/*
* input :Seconds/Millisecond
* out : date struct(yyyy/mm/dd hh/mm/ss)
*/
int SKY_GetDataTimeFromUTCTime(int64_t llUTCTime,dataTime_t *lpDataTime)
{
struct tm timer, *time = &timer;
int64_t llUTCTimeSecond = llUTCTime / 1000000;
int64_t llUTCTimeMicros = llUTCTime % 1000000;
#ifdef _WIN32
localtime_s(time,(time_t*)&llUTCTimeSecond);
#else
localtime_r((time_t*)&llUTCTimeSecond,time);
#endif
lpDataTime->wYear = time->tm_year + 1900;
lpDataTime->wMonth = time->tm_mon + 1;
lpDataTime->wDayOfWeek = time->tm_wday;
lpDataTime->wDay = time->tm_mday;
lpDataTime->wHour = time->tm_hour;
lpDataTime->wMinute = time->tm_min;
lpDataTime->wSecond = time->tm_sec;
lpDataTime->wMilliseconds = llUTCTimeMicros / 1000;
return 0;
}
/*
* input :date struct(yyyy/mm/dd hh/mm/ss)
* out : Seconds/Millisecond
*/
int64_t SKY_GetUTCTimeFromDataTime(dataTime_t *lpDataTime)
{
struct tm _tm = { 0 };
_tm.tm_sec = lpDataTime->wSecond;
_tm.tm_min = lpDataTime->wMinute;
_tm.tm_hour = lpDataTime->wHour;
_tm.tm_mday = lpDataTime->wDay;
_tm.tm_mon = lpDataTime->wMonth - 1;
_tm.tm_year = lpDataTime->wYear - 1900;
// time_t llUTCTimeSecond = mktime(&_tm); //此处在不同平台可能会出现异常
int64_t llUTCTimeSecond = mktime(&_tm);
int64_t llUTCTimeMicros = lpDataTime->wMilliseconds * 1000;
int64_t llUTCTime = llUTCTimeSecond * 1000000 + llUTCTimeMicros;
return llUTCTime;
}
在项目过程中涉及到时间操作相关的细节问题,现在将常用的方法整理出来,方便大家借鉴,同时发现问题,请积极提出。