Here are some functions I use:
typedef int64_t timestamp_t;
timestamp_t currentTimestamp( void )
{
  struct timeval tv;
  struct timezone tz;
  timestamp_t timestamp = 0;
  struct tm when;
  timestamp_t localeOffset = 0;
  { // add localtime to UTC
    localtime_r ( (time_t*)×tamp, &when);
    localeOffset = when.tm_gmtoff * 1000;
  }
  gettimeofday (&tv, &tz );
  timestamp = ((timestamp_t)((tv.tv_sec) * 1000) ) + ( (timestamp_t)((tv.tv_usec) / 1000) );
  timestamp+=localeOffset;
  return timestamp;
}
/* ----------------------------------------------------------------------------- */
int32_t timestampToStructtm ( timestamp_t timestamp, struct tm* dateStruct)
{
  timestamp /= 1000; // required timestamp in seconds!
  //localtime_r ( ×tamp, dateStruct);
  gmtime_r ( ×tamp, dateStruct);
  return 0;
}
/* ----------------------------------------------------------------------------- */
int32_t sprintf_timestampAsYYYYMMDDHHMMSS ( char* buf, timestamp_t timestamp )
{
  int year = 0;
  int month = 0;
  int day = 0;
  int hour = 0;
  int minute = 0;
  int second = 0;
  struct tm timeStruct;
  if (timestamp==TIMESTAMP_NULL) {
    return sprintf(buf, "NULL_TIMESTAMP");
  }
  memset (&timeStruct, 0, sizeof (struct tm));
  timestampToStructtm(timestamp, &timeStruct);
  year = timeStruct.tm_year + 1900;
  month = timeStruct.tm_mon + 1;
  day = timeStruct.tm_mday;
  hour = timeStruct.tm_hour;
  minute = timeStruct.tm_min;
  second = timeStruct.tm_sec;
  return sprintf(buf, "%04d%02d%02d%02d%02d%02d", year, month, day, hour, minute, second);
}