]>
Commit | Line | Data |
---|---|---|
46f4442e A |
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 |