// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
**********************************************************************
* 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());
}