// Qt wrapper around qt_ucal_getTimeZoneTransitionDate & ucal_get static QTimeZonePrivate::Data ucalTimeZoneTransition(UCalendar *m_ucal, UTimeZoneTransitionType type, qint64 atMSecsSinceEpoch) { QTimeZonePrivate::Data tran = QTimeZonePrivate::invalidData(); // Clone the ucal so we don't change the shared object UErrorCode status = U_ZERO_ERROR; UCalendar *ucal = ucal_clone(m_ucal, &status); if (!U_SUCCESS(status)) return tran; // Set the date to find the transition for status = U_ZERO_ERROR; ucal_setMillis(ucal, atMSecsSinceEpoch, &status); // Find the transition time UDate tranMSecs = 0; status = U_ZERO_ERROR; bool ok = ucal_getTimeZoneTransitionDate(ucal, type, &tranMSecs, &status); // Set the transition time to find the offsets for if (U_SUCCESS(status) && ok) { status = U_ZERO_ERROR; ucal_setMillis(ucal, tranMSecs, &status); } int32_t utc = 0; if (U_SUCCESS(status) && ok) { status = U_ZERO_ERROR; utc = ucal_get(ucal, UCAL_ZONE_OFFSET, &status) / 1000; } int32_t dst = 0; if (U_SUCCESS(status) && ok) { status = U_ZERO_ERROR; dst = ucal_get(ucal, UCAL_DST_OFFSET, &status) / 1000; } ucal_close(ucal); if (!U_SUCCESS(status) || !ok) return tran; tran.atMSecsSinceEpoch = tranMSecs; tran.offsetFromUtc = utc + dst; tran.standardTimeOffset = utc; tran.daylightTimeOffset = dst; // TODO No ICU API, use short name instead if (dst == 0) tran.abbreviation = ucalTimeZoneDisplayName(m_ucal, QTimeZone::StandardTime, QTimeZone::ShortName, QLocale().name()); else tran.abbreviation = ucalTimeZoneDisplayName(m_ucal, QTimeZone::DaylightTime, QTimeZone::ShortName, QLocale().name()); return tran; }
static char* calendar_clone(char* obj) { UErrorCode status = U_ZERO_ERROR; obj = (char*) ucal_clone((UCalendar*) obj, &status); if(U_FAILURE(status)) { return NULL; } return obj; }
QIcuTimeZonePrivate::QIcuTimeZonePrivate(const QIcuTimeZonePrivate &other) : QTimeZonePrivate(other), m_ucal(0) { // Clone the ucal so we don't close the shared object UErrorCode status = U_ZERO_ERROR; m_ucal = ucal_clone(other.m_ucal, &status); if (!U_SUCCESS(status)) { m_id.clear(); m_ucal = 0; } }
/* {{{ * Internal function which sets UCalendar from the passed array and retrieves timestamp */ static UDate internal_get_timestamp(IntlDateFormatter_object *dfo, HashTable *hash_arr) { int32_t year, month, hour, minute, second, mday; UCalendar *pcal; UDate result; intl_error *err = &dfo->datef_data.error; #define INTL_GET_ELEM(elem) \ internal_get_arr_ele(dfo, hash_arr, (elem), err) /* Fetch values from the incoming array */ year = INTL_GET_ELEM(CALENDAR_YEAR) + 1900; /* tm_year is years since 1900 */ /* Month in ICU and PHP starts from January =0 */ month = INTL_GET_ELEM(CALENDAR_MON); hour = INTL_GET_ELEM(CALENDAR_HOUR); minute = INTL_GET_ELEM(CALENDAR_MIN); second = INTL_GET_ELEM(CALENDAR_SEC); /* For the ucal_setDateTime() function, this is the 'date' value */ mday = INTL_GET_ELEM(CALENDAR_MDAY); #undef INTL_GET_ELEM pcal = ucal_clone(udat_getCalendar(DATE_FORMAT_OBJECT(dfo)), &INTL_DATA_ERROR_CODE(dfo)); if (INTL_DATA_ERROR_CODE(dfo) != U_ZERO_ERROR) { intl_errors_set(err, INTL_DATA_ERROR_CODE(dfo), "datefmt_format: " "error cloning calendar", 0); return 0; } /* set the incoming values for the calendar */ ucal_setDateTime(pcal, year, month, mday, hour, minute, second, &INTL_DATA_ERROR_CODE(dfo)); /* actually, ucal_setDateTime cannot fail */ /* Fetch the timestamp from the UCalendar */ result = ucal_getMillis(pcal, &INTL_DATA_ERROR_CODE(dfo)); ucal_close(pcal); return result; }
bool QIcuTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const { // Clone the ucal so we don't change the shared object UErrorCode status = U_ZERO_ERROR; UCalendar *ucal = ucal_clone(m_ucal, &status); if (!U_SUCCESS(status)) return false; // Set the date to find the offset for status = U_ZERO_ERROR; ucal_setMillis(ucal, atMSecsSinceEpoch, &status); bool result = false; if (U_SUCCESS(status)) { status = U_ZERO_ERROR; result = ucal_inDaylightTime(ucal, &status); } ucal_close(ucal); return result; }
// Qt wrapper around ucal_get() for offsets static bool ucalOffsetsAtTime(UCalendar *m_ucal, qint64 atMSecsSinceEpoch, int *utcOffset, int *dstOffset) { *utcOffset = 0; *dstOffset = 0; // Clone the ucal so we don't change the shared object UErrorCode status = U_ZERO_ERROR; UCalendar *ucal = ucal_clone(m_ucal, &status); if (!U_SUCCESS(status)) return false; // Set the date to find the offset for status = U_ZERO_ERROR; ucal_setMillis(ucal, atMSecsSinceEpoch, &status); int32_t utc = 0; if (U_SUCCESS(status)) { status = U_ZERO_ERROR; // Returns msecs utc = ucal_get(ucal, UCAL_ZONE_OFFSET, &status) / 1000; } int32_t dst = 0; if (U_SUCCESS(status)) { status = U_ZERO_ERROR; // Returns msecs dst = ucal_get(ucal, UCAL_DST_OFFSET, &status) / 1000; } ucal_close(ucal); if (U_SUCCESS(status)) { *utcOffset = utc; *dstOffset = dst; return true; } return false; }