text: /*
  **********************************************************************
  *   Copyright (C) 2007-2007, International Business Machines
  *   Corporation and others.  All Rights Reserved.
  **********************************************************************
  *
  * File tzdate.c
  *
  * Author:  Michael Ow
  *
  **********************************************************************
  */
  
  #include <stdlib.h>
  #include <stdio.h>
  #include <time.h>
  #include <string.h>
  
  #include "unicode/utypes.h"
  #include "unicode/ustring.h"
  #include "unicode/uclean.h"
  
  #include "unicode/ucnv.h"
  #include "unicode/udat.h"
  #include "unicode/ucal.h"
  
  #include "putilimp.h"
  
  #define SIZE 80
  #define OFFSET_MONTH 1
  
  int64_t getSystemCurrentTime(char* systime, int year, int month, int day, int hour, int minute, int useCurrentTime);
  void getICUCurrentTime(char* icutime, double timeToCheck);
  void printTime(char* systime, char* icutime);
  
  int main(int argc, char** argv) {
      char systime[SIZE];
      char icutime[SIZE];
      int year, month, day, hour, minute;
      int sysyear;
      int useCurrentTime;
      int64_t systemtime;
      
      sysyear = year = month = day = 0;
      
      if (argc <= 6) {
          fprintf(stderr, "Not enough arguments\n");
          return -1;
      }
  
      year = atoi(argv[1]);
      month = atoi(argv[2]);
      day = atoi(argv[3]);
      hour = atoi(argv[4]);
      minute = atoi(argv[5]);
      useCurrentTime = atoi(argv[6]);
      
      /* format year for system time */
      sysyear = year - 1900;
      
      systemtime = getSystemCurrentTime(systime, sysyear, month, day, hour, minute, useCurrentTime);
      getICUCurrentTime(icutime, systemtime * U_MILLIS_PER_SECOND);
  
      /* print out the times if failed */
      if (strcmp(systime, icutime) != 0) {
          printf("Failed\n");
          printTime(systime, icutime);
      }
  
      return 0;
  }
  
  void getICUCurrentTime(char* icutime, double timeToCheck) {
      UDateFormat *fmt;
      const UChar *tz = 0;
      UChar *s = 0;
      UDateFormatStyle style = UDAT_RELATIVE;
      UErrorCode status = U_ZERO_ERROR;
      int32_t len = 0;
      int i;
  
      fmt = udat_open(style, style, 0, tz, -1,NULL,0, &status);
  
      len = udat_format(fmt, timeToCheck, 0, len, 0, &status);
  
      if (status == U_BUFFER_OVERFLOW_ERROR)
          status = U_ZERO_ERROR;
  
      s = (UChar*) malloc(sizeof(UChar) * (len+1));
  
      if(s == 0) 
          goto finish;
  
      udat_format(fmt, timeToCheck, s, len + 1, 0, &status);
      
      if (U_FAILURE(status)) 
          goto finish;
  
      /* +1 to NULL terminate */
      for(i = 0; i < len+1; i++) {
          icutime[i] = (char)s[i];
      }
  
  finish:
      udat_close(fmt);
      free(s);
  }
  
  int64_t getSystemCurrentTime(char* systime, int year, int month, int day, int hour, int minute, int useCurrentTime) {
      time_t now;
      struct tm ts;
  
      if (useCurrentTime){
          time(&now);
          ts = *localtime(&now);
      }
      else {
          memset(&ts, 0, sizeof(ts));
          ts.tm_year = year;
          ts.tm_mon = month - OFFSET_MONTH;
          ts.tm_mday = day;
          ts.tm_hour = hour;
          ts.tm_min = minute;
  
          now = mktime(&ts);
          ts = *localtime(&now);
      }
  
      /* Format the string */
      strftime(systime, sizeof(char) * 80, "%Y%m%d %I:%M %p", &ts);
  
      return (double)now;
  }
  
  void printTime(char* systime, char* icutime) {
      printf("System Time:  %s\n", systime);
      printf("ICU Time:     %s\n", icutime);
      printf("STD=%s DST=%s OFFSET=%d\n", uprv_tzname(0), uprv_tzname(1), uprv_timezone());
  }
  
  