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