UTC 转 LocalTime
/*使用unsigned const char*纯碎是为了配合项目,改成char*会比较通用些*/ BOOL CDllSuiteEngine::Time_StrToType(unsigned const char* lpszValue, SYSTEMTIME &time) { if (!lpszValue) { return FALSE; } int nYear = 0; int nMonth = 0; int nDay = 0; int nHour = 0; int nSecond = 0; int nMinute = 0; int nMilliSecond = 0; CString str = lpszValue; sscanf(str, _T("%d-%d-%dT%d:%d:%d.%dZ"), &nYear, &nMonth, &nDay, &nHour, &nMinute, &nSecond,&nMilliSecond); // if (nMonth==0 || nDay==0) // { // _stscanf(str, _T("%d/%d/%d %d:%d:%d"), &nYear, &nMonth, &nDay, &nHour, &nMinute, &nSecond); // } time.wYear = nYear; time.wMonth = nMonth; time.wDay = nDay; time.wHour = nHour; time.wSecond = nSecond; time.wMinute = nMinute; time.wMilliseconds = nMilliSecond;//MUST be set, or all member of converted local time is 52428 return TRUE; } void CDllSuiteEngine::Time_UTCToLocal(SYSTEMTIME& tUTC, SYSTEMTIME& tLocal) { //e.g. "2013-06-23T19:10:57.000Z"; TIME_ZONE_INFORMATION timeZomeInfo; ::GetTimeZoneInformation(&timeZomeInfo); ::SystemTimeToTzSpecificLocalTime(&timeZomeInfo, &tUTC, &tLocal); //Careful: member MilliSeconds must be set. } void CDllSuiteEngine::Time_TypeToStr(SYSTEMTIME tType,CString& szTime) { szTime.Empty(); szTime.Format(_T("%04d-%02d-%02d %02d:%02d:%02d"), tType.wYear, tType.wMonth, tType.wDay, tType.wHour, tType.wMinute, tType.wSecond); } void CDllSuiteEngine::Time_UTCStrToLocalStr(unsigned const char* szUTC,CString& cLocal) { cLocal.Empty(); if(!szUTC) return; SYSTEMTIME tUTC; SYSTEMTIME tLocal; if(Time_StrToType(szUTC, tUTC)) { Time_UTCToLocal(tUTC, tLocal); Time_TypeToStr(tLocal, cLocal); } } void main() { CString cLocalTime; Time_UTCStrToLocalStr("2013-06-23T19:10:57.000Z",cLocalTime); //output.. }
北京 UTC+8
Hawaii UTC-10