blob: 29c20c6872e64b414cbc3d4a2f2d4932b04cec34 [file] [log] [blame]
/**
* Copyright (C) 2013 Regents of the University of California.
* @author: Jeff Thompson <jefft0@remap.ucla.edu>
* See COPYING for copyright and distribution information.
*/
#include <ndn-cpp/ndn-cpp-config.h>
#if NDN_CPP_HAVE_TIME_H
#include <time.h>
#endif
#if NDN_CPP_HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#include <math.h>
#include <string.h>
#include <stdio.h>
#include "time.h"
ndn_MillisecondsSince1970
ndn_getNowMilliseconds()
{
struct timeval t;
// Note: configure.ac requires gettimeofday.
gettimeofday(&t, 0);
return t.tv_sec * 1000.0 + t.tv_usec / 1000.0;
}
ndn_Error
ndn_toIsoString(ndn_MillisecondsSince1970 milliseconds, char *isoString)
{
#if NDN_CPP_HAVE_GMTIME_SUPPORT
if (milliseconds < 0)
return NDN_ERROR_Calendar_time_value_out_of_range;
else if (milliseconds > 2e14)
// 2e14 is about the year 8300. We don't want to go over a 4-digit year.
return NDN_ERROR_Calendar_time_value_out_of_range;
double secondsSince1970 = milliseconds / 1000.0;
char fractionBuffer[10];
sprintf(fractionBuffer, "%.06lf", fmod(secondsSince1970, 1.0));
const char *fraction = strchr(fractionBuffer, '.');
if (!fraction)
// Don't expect this to happen.
fraction = ".000000";
time_t seconds = (time_t)secondsSince1970;
struct tm* gmt = gmtime(&seconds);
sprintf(isoString, "%04d%02d%02dT%02d%02d%02d%s", 1900 + gmt->tm_year, gmt->tm_mon + 1, gmt->tm_mday,
gmt->tm_hour, gmt->tm_min, gmt->tm_sec, fraction);
return NDN_ERROR_success;
#else
return NDN_ERROR_Time_functions_are_not_supported_by_the_standard_library;
#endif
}
ndn_Error
ndn_fromIsoString(const char* isoString, ndn_MillisecondsSince1970 *milliseconds)
{
#if NDN_CPP_HAVE_GMTIME_SUPPORT
// Initialize time zone, etc.
time_t dummyTime = 0;
struct tm tm1 = *gmtime(&dummyTime);
sscanf(isoString, "%4d%2d%2dT%2d%2d", &tm1.tm_year, &tm1.tm_mon, &tm1.tm_mday, &tm1.tm_hour, &tm1.tm_min);
// Skip the time past minutes and get the float seconds.
double seconds;
sscanf(isoString + (4 + 2 + 2 + 1 + 2 + 2), "%lf", &seconds);
// tm_year starts from 1900.
tm1.tm_year -= 1900;
// tm_mon starts from 0, not 1.
tm1.tm_mon -= 1;
tm1.tm_sec = 0;
*milliseconds = (timegm(&tm1) + seconds) * 1000.0;
return NDN_ERROR_success;
#else
return NDN_ERROR_Time_functions_are_not_supported_by_the_standard_library;
#endif
}