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