1 /* 2 ********************************************************************** 3 * Copyright (C) 2007-2007, International Business Machines 4 * Corporation and others. All Rights Reserved. 5 ********************************************************************** 6 * 7 * File tzdate.c 8 * 9 * Author: Michael Ow 10 * 11 ********************************************************************** 12 */ 13 14 #include <stdlib.h> 15 #include <stdio.h> 16 #include <time.h> 17 #include <string.h> 18 19 #include "unicode/utypes.h" 20 #include "unicode/ustring.h" 21 #include "unicode/uclean.h" 22 23 #include "unicode/ucnv.h" 24 #include "unicode/udat.h" 25 #include "unicode/ucal.h" 26 27 #include "putilimp.h" 28 29 #define SIZE 80 30 #define OFFSET_MONTH 1 31 32 int64_t getSystemCurrentTime(char* systime, int year, int month, int day, int hour, int minute, int useCurrentTime); 33 void getICUCurrentTime(char* icutime, double timeToCheck); 34 void printTime(char* systime, char* icutime); 35 36 int main(int argc, char** argv) { 37 char systime[SIZE]; 38 char icutime[SIZE]; 39 int year, month, day, hour, minute; 40 int sysyear; 41 int useCurrentTime; 42 int64_t systemtime; 43 44 sysyear = year = month = day = 0; 45 46 if (argc <= 6) { 47 fprintf(stderr, "Not enough arguments\n"); 48 return -1; 49 } 50 51 year = atoi(argv[1]); 52 month = atoi(argv[2]); 53 day = atoi(argv[3]); 54 hour = atoi(argv[4]); 55 minute = atoi(argv[5]); 56 useCurrentTime = atoi(argv[6]); 57 58 /* format year for system time */ 59 sysyear = year - 1900; 60 61 systemtime = getSystemCurrentTime(systime, sysyear, month, day, hour, minute, useCurrentTime); 62 getICUCurrentTime(icutime, systemtime * U_MILLIS_PER_SECOND); 63 64 /* print out the times if failed */ 65 if (strcmp(systime, icutime) != 0) { 66 printf("Failed\n"); 67 printTime(systime, icutime); 68 } 69 70 return 0; 71 } 72 73 void getICUCurrentTime(char* icutime, double timeToCheck) { 74 UDateFormat *fmt; 75 const UChar *tz = 0; 76 UChar *s = 0; 77 UDateFormatStyle style = UDAT_RELATIVE; 78 UErrorCode status = U_ZERO_ERROR; 79 int32_t len = 0; 80 int i; 81 82 fmt = udat_open(style, style, 0, tz, -1,NULL,0, &status); 83 84 len = udat_format(fmt, timeToCheck, 0, len, 0, &status); 85 86 if (status == U_BUFFER_OVERFLOW_ERROR) 87 status = U_ZERO_ERROR; 88 89 s = (UChar*) malloc(sizeof(UChar) * (len+1)); 90 91 if(s == 0) 92 goto finish; 93 94 udat_format(fmt, timeToCheck, s, len + 1, 0, &status); 95 96 if (U_FAILURE(status)) 97 goto finish; 98 99 /* +1 to NULL terminate */ 100 for(i = 0; i < len+1; i++) { 101 icutime[i] = (char)s[i]; 102 } 103 104 finish: 105 udat_close(fmt); 106 free(s); 107 } 108 109 int64_t getSystemCurrentTime(char* systime, int year, int month, int day, int hour, int minute, int useCurrentTime) { 110 time_t now; 111 struct tm ts; 112 113 if (useCurrentTime){ 114 time(&now); 115 ts = *localtime(&now); 116 } 117 else { 118 memset(&ts, 0, sizeof(ts)); 119 ts.tm_year = year; 120 ts.tm_mon = month - OFFSET_MONTH; 121 ts.tm_mday = day; 122 ts.tm_hour = hour; 123 ts.tm_min = minute; 124 125 now = mktime(&ts); 126 ts = *localtime(&now); 127 } 128 129 /* Format the string */ 130 strftime(systime, sizeof(char) * 80, "%Y%m%d %I:%M %p", &ts); 131 132 return (double)now; 133 } 134 135 void printTime(char* systime, char* icutime) { 136 printf("System Time: %s\n", systime); 137 printf("ICU Time: %s\n", icutime); 138 printf("STD=%s DST=%s OFFSET=%d\n", uprv_tzname(0), uprv_tzname(1), uprv_timezone()); 139 } 140 141