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