From: <svn...@op...> - 2010-08-16 18:45:17
|
Author: cdfrey Date: Mon Aug 16 20:45:08 2010 New Revision: 6094 URL: http://www.opensync.org/changeset/6094 Log: Enhanced osync_time_timestamp() to handle ISO timezone offsets as well If an ISO 8601 timezone offset exists in the timestamp passed to osync_time_timestamp(), then it will attempt to convert it into a UTC vtime timestamp in the form of YYYYMMDDTHHMMSSZ, which is the Opensync time format. Modified: trunk/opensync/format/opensync_time.c trunk/opensync/format/opensync_time.h trunk/tests/CMakeLists.txt trunk/tests/format-tests/check_time.c Modified: trunk/opensync/format/opensync_time.c ============================================================================== --- trunk/opensync/format/opensync_time.c Mon Aug 16 20:44:57 2010 (r6093) +++ trunk/opensync/format/opensync_time.c Mon Aug 16 20:45:08 2010 (r6094) @@ -95,11 +95,39 @@ char *osync_time_timestamp(const char *vtime) { - char *timestamp; + char *timestamp = NULL; + int found, offset; + OSyncError *error = NULL; osync_trace(TRACE_ENTRY, "%s(%s)", __func__, vtime); - timestamp = osync_time_timestamp_remove_dash(vtime); + // check for ISO 8601 timezone offset + // YYYY-MM-DDTHH:MM:SS.uuu-HH:MM + offset = osync_time_parse_iso_timezone_diff(vtime, &found, &error); + if( error ) + osync_error_unref(&error); + if( found ) { + time_t utc = osync_time_vtime2unix(vtime, offset, &error); + if( error ) { + osync_error_unref(&error); + } + else { + timestamp = osync_time_unix2vtime(&utc, &error); + if( error ) { + osync_error_unref(&error); + if( timestamp ) { + free(timestamp); + timestamp = NULL; + } + } + } + } + // timezone and unix conversion didn't work... fallback to dash removal + if( timestamp == NULL ) { + timestamp = osync_time_timestamp_remove_dash(vtime); + } + + // return timestamp in YYYYMMDDTHHMMSSZ osync_trace(TRACE_EXIT, "%s: %s", __func__, timestamp); return timestamp; } Modified: trunk/opensync/format/opensync_time.h ============================================================================== --- trunk/opensync/format/opensync_time.h Mon Aug 16 20:44:57 2010 (r6093) +++ trunk/opensync/format/opensync_time.h Mon Aug 16 20:45:08 2010 (r6094) @@ -43,6 +43,9 @@ */ /** @brief Function returns a date-timestamp in OSyncTime Spec format + * OSyncTime Spec format is YYYYMMDDTHHMMSSZ with Z optional. + * Input format can be in ISO 8601, including dashes and timezone + * offsets, and the returned timestamp will adjust it to UTC. * * @param vtime The timestamp which gets converted to a valid osync date-timestamp * @returns vtime date-timestring (the caller is responsible for freeing) Modified: trunk/tests/CMakeLists.txt ============================================================================== --- trunk/tests/CMakeLists.txt Mon Aug 16 20:44:57 2010 (r6093) +++ trunk/tests/CMakeLists.txt Mon Aug 16 20:45:08 2010 (r6094) @@ -393,6 +393,7 @@ OSYNC_TESTCASE(time time_relative2tm) OSYNC_TESTCASE(time time_unix_converters) OSYNC_TESTCASE(time time_utc_offset) +OSYNC_TESTCASE(time time_timestamp) BUILD_CHECK_TEST( version version-tests/check_version.c ${TEST_TARGET_LIBRARIES} ) OSYNC_TESTCASE(version version_new) Modified: trunk/tests/format-tests/check_time.c ============================================================================== --- trunk/tests/format-tests/check_time.c Mon Aug 16 20:44:57 2010 (r6093) +++ trunk/tests/format-tests/check_time.c Mon Aug 16 20:45:08 2010 (r6094) @@ -296,11 +296,24 @@ } END_TEST +START_TEST(time_timestamp) +{ + char *result = osync_time_timestamp("2010-08-10T11:15:22.234-03:00"); + int match = strcmp(result, "20100810T141522Z"); + fail_unless(match == 0, NULL); + + result = osync_time_timestamp("2010-08-10T11:15:22.234-03:0"); + match = strcmp(result, "20100810T111522.234-030"); + fail_unless(match == 0, NULL); +} +END_TEST + OSYNC_TESTCASE_START("time") OSYNC_TESTCASE_ADD(time_timezone_diff) OSYNC_TESTCASE_ADD(time_parse_iso_timezone_diff) OSYNC_TESTCASE_ADD(time_relative2tm) OSYNC_TESTCASE_ADD(time_unix_converters) OSYNC_TESTCASE_ADD(time_utc_offset) +OSYNC_TESTCASE_ADD(time_timestamp) OSYNC_TESTCASE_END |