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