C and C++ standard library conversion from UTC time to local local time

  • 2020-06-01 10:22:25
  • OfStack


There is a difference of 8 time zones between UTC time DateTime. UtcNow and system local time DateTime. Now, and there is a difference of 15 time zones between local time and Beijing time in the United States.


1. If there is a website for global users, 1 usually stores time in UTC format when storing time data, so that time is unified and can be accurately converted according to the local time zone.

2. The problem with storing local time is that if you change the time zone, the displayed time is not correct, so we'd better store the UTC time to facilitate the correct conversion.


1. The C/C++ standard library provides standard functions that can be converted without the help of Win32 API.


// test_datetime_format.cpp :  Define the entry point for the console application. 

#include "stdafx.h"
#include <time.h>
#include <sstream>
#include <iostream>
#include <assert.h>

//2014-09-13 10:52:36
char* ConvertUtcToLocalTime(struct tm* t2,const char* date){

 struct tm t;
 t.tm_year = atoi(date)-1900;
 t.tm_mon = atoi(date+5)-1;
 t.tm_mday = atoi(date+8);
 t.tm_hour = atoi(date+11);
 t.tm_min = atoi(date+14);
 t.tm_sec = atoi(date+17);

 time_t tt = _mkgmtime64(&t);
 if(tt != -1){
 if(t2 == NULL){
  t2 = &t; 
 *t2 = *localtime(&tt);
 char* ds = (char*) malloc(24);
 memset(ds, 0, 24);
 sprintf(ds, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", t2->tm_year + 1900,
  t2->tm_mon + 1, t2->tm_mday, t2->tm_hour, t2->tm_min,
 return ds;
 return NULL;

int _tmain(int argc, _TCHAR* argv[])
 const char* kTime = "2014-09-13 18:52:36";
 std::cout << "Source DateTime: " << "2014-09-13T10:52:36Z" << std::endl;
 auto t = ConvertUtcToLocalTime(NULL,"2014-09-13T10:52:36Z");
 std::cout << "Dest DateTime: " << t << std::endl;

 t = ConvertUtcToLocalTime(NULL,"2014-09-13 10:52:36");
 std::cout << t << std::endl;

 struct tm tt;
 t = ConvertUtcToLocalTime(&tt,"2014-09-13 10:52:36");
 std::cout << t << std::endl;
 assert(tt.tm_year == (2014-1900));
 assert(tt.tm_mon == 9-1);
 assert(tt.tm_mday == 13);
 assert(tt.tm_hour == 18);
 assert(tt.tm_min == 52);
 assert(tt.tm_sec == 36);

 return 0;


The output

Source DateTime: 2014-09-13T10:52:36Z
Dest DateTime: 2014-09-13 18:52:36
2014-09-13 18:52:36
2014-09-13 18:52:36

C++ gets the implementation code for UTC with time accurate to microseconds

Statistics of time-like functions are often used in daily development. It is quite common to obtain UTC time from 1970 to now, but there is no function directly accurate to the subtle level available under windows. This article provides a way to address just such a requirement.

The following is the implementation code of C++ :

The code is as follows:


#include <windows.h>
#include <sys/timeb.h>
#include <time.h> 

#if !defined(_WINSOCK2API_) && !defined(_WINSOCKAPI_)
struct timeval
long tv_sec;
long tv_usec;

static int gettimeofday(struct timeval* tv)
 union {
    long long ns100;
    FILETIME ft;
 } now;
 GetSystemTimeAsFileTime (&now.ft);
 tv->tv_usec = (long) ((now.ns100 / 10LL) % 1000000LL);
 tv->tv_sec = (long) ((now.ns100 - 116444736000000000LL) / 10000000LL);

 return (0);
// To obtain 1970 So far this year UTC The number of subtle 
static time_t TimeConversion::GetUtcCaressing()
 timeval tv;
 return ((time_t)tv.tv_sec*(time_t)1000000+tv.tv_usec);

The usage method is given below:

timeval tv;

Or directly call: GetUtcCaressing();

UTC time level UTC acquisition method code:

time_t timep;
struct tm *p;
timep = mktime(p);



NOTE-datetime _mkgmtime timegm - Linux man page Converting Between Local Times and GMT/UTC in C/C++

Related articles: