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 32int64_t getSystemCurrentTime(char* systime, int year, int month, int day, int hour, int minute, int useCurrentTime); 33void getICUCurrentTime(char* icutime, double timeToCheck); 34void printTime(char* systime, char* icutime); 35 36int 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 73void 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 104finish: 105 udat_close(fmt); 106 free(s); 107} 108 109int64_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 135void 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