Home | History | Annotate | Download | only in compat
      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 
    141