static void getTimeZonesNative(JNIEnv* env, jclass clazz, jobjectArray outerArray, jstring locale) { // get all timezone objects jobjectArray zoneIdArray = (jobjectArray) env->GetObjectArrayElement(outerArray, 0); int count = env->GetArrayLength(zoneIdArray); TimeZone* zones[count]; for(int i = 0; i < count; i++) { jstring id = (jstring) env->GetObjectArrayElement(zoneIdArray, i); zones[i] = timeZoneFromId(env, id); env->DeleteLocalRef(id); } Locale loc = getLocale(env, locale); UErrorCode status = U_ZERO_ERROR; UnicodeString longPattern("zzzz",""); SimpleDateFormat longFormat(longPattern, loc, status); UnicodeString shortPattern("z",""); SimpleDateFormat shortFormat(shortPattern, loc, status); jobjectArray longStdTimeArray = (jobjectArray) env->GetObjectArrayElement(outerArray, 1); jobjectArray shortStdTimeArray = (jobjectArray) env->GetObjectArrayElement(outerArray, 2); jobjectArray longDlTimeArray = (jobjectArray) env->GetObjectArrayElement(outerArray, 3); jobjectArray shortDlTimeArray = (jobjectArray) env->GetObjectArrayElement(outerArray, 4); // 15th January 2008 UDate date1 = 1203105600000.0; // 15th July 2008 UDate date2 = 1218826800000.0; for (int i = 0; i < count; ++i) { TimeZone* tz = zones[i]; longFormat.setTimeZone(*tz); shortFormat.setTimeZone(*tz); int32_t daylightOffset; int32_t rawOffset; tz->getOffset(date1, false, rawOffset, daylightOffset, status); UDate standardDate; UDate daylightSavingDate; if (daylightOffset != 0) { // The Timezone is reporting that we are in daylight time // for the winter date. The dates are for the wrong hemisphere, // swap them. standardDate = date2; daylightSavingDate = date1; } else { standardDate = date1; daylightSavingDate = date2; } jstring content = formatDate(env, shortFormat, daylightSavingDate); env->SetObjectArrayElement(shortDlTimeArray, i, content); env->DeleteLocalRef(content); content = formatDate(env, shortFormat, standardDate); env->SetObjectArrayElement(shortStdTimeArray, i, content); env->DeleteLocalRef(content); content = formatDate(env, longFormat, daylightSavingDate); env->SetObjectArrayElement(longDlTimeArray, i, content); env->DeleteLocalRef(content); content = formatDate(env, longFormat, standardDate); env->SetObjectArrayElement(longStdTimeArray, i, content); env->DeleteLocalRef(content); delete tz; } }
static void getTimeZonesNative(JNIEnv* env, jclass clazz, jobjectArray outerArray, jstring locale) { // LOGI("ENTER getTimeZonesNative"); UErrorCode status = U_ZERO_ERROR; jobjectArray zoneIdArray; jobjectArray longStdTimeArray; jobjectArray shortStdTimeArray; jobjectArray longDlTimeArray; jobjectArray shortDlTimeArray; jstring content; jstring strObj; const jchar *res; UnicodeString resU; jint length; const UnicodeString *zoneID; DateFormat *df; UnicodeString longPattern("zzzz",""); UnicodeString shortPattern("z",""); Locale loc = getLocale(env, locale); SimpleDateFormat longFormat(longPattern, loc, status); SimpleDateFormat shortFormat(shortPattern, loc, status); zoneIdArray = (jobjectArray) env->GetObjectArrayElement(outerArray, 0); longStdTimeArray = (jobjectArray) env->GetObjectArrayElement(outerArray, 1); shortStdTimeArray = (jobjectArray) env->GetObjectArrayElement(outerArray, 2); longDlTimeArray = (jobjectArray) env->GetObjectArrayElement(outerArray, 3); shortDlTimeArray = (jobjectArray) env->GetObjectArrayElement(outerArray, 4); int count = env->GetArrayLength(zoneIdArray); TimeZone* zones[count]; // get all timezone objects for(int i = 0; i < count; i++) { strObj = (jstring) env->GetObjectArrayElement(zoneIdArray, i); length = env->GetStringLength(strObj); res = env->GetStringChars(strObj, NULL); const UnicodeString zoneID((UChar *)res, length); env->ReleaseStringChars(strObj, res); zones[i] = TimeZone::createTimeZone(zoneID); } // 15th January 2008 UDate date1 = 1203105600000.0; // 15th July 2008 UDate date2 = 1218826800000.0; for (int i = 0; i < count; i++) { TimeZone *tz = zones[i]; longFormat.setTimeZone(*tz); shortFormat.setTimeZone(*tz); int32_t daylightOffset; int32_t rawOffset; UDate standardDate; UDate daylightSavingDate; tz->getOffset(date1, false, rawOffset, daylightOffset, status); if (daylightOffset != 0) { // The Timezone is reporting that we are in daylight time // for the winter date. The dates are for the wrong hemisphere, // swap them. standardDate = date2; daylightSavingDate = date1; } else { standardDate = date1; daylightSavingDate = date2; } UnicodeString shortDayLight; UnicodeString longDayLight; UnicodeString shortStandard; UnicodeString longStandard; shortFormat.format(daylightSavingDate, shortDayLight); content = getJStringFromUnicodeString(env, shortDayLight); env->SetObjectArrayElement(shortDlTimeArray, i, content); env->DeleteLocalRef(content); shortFormat.format(standardDate, shortStandard); content = getJStringFromUnicodeString(env, shortStandard); env->SetObjectArrayElement(shortStdTimeArray, i, content); env->DeleteLocalRef(content); longFormat.format (daylightSavingDate, longDayLight); content = getJStringFromUnicodeString(env, longDayLight); env->SetObjectArrayElement(longDlTimeArray, i, content); env->DeleteLocalRef(content); longFormat.format (standardDate, longStandard); content = getJStringFromUnicodeString(env, longStandard); env->SetObjectArrayElement(longStdTimeArray, i, content); env->DeleteLocalRef(content); delete(tz); } }