static void cal(int32_t month, int32_t year, UBool useLongNames, UErrorCode *status) { UCalendar *c; UChar *days [DAY_COUNT]; UChar *months [MONTH_COUNT]; int32_t fdow; if(U_FAILURE(*status)) return; /* Create a new calendar */ c = ucal_open(0, -1, uloc_getDefault(), UCAL_TRADITIONAL, status); /* Determine if we are printing a calendar for one month or for a year */ /* Print an entire year */ if(month == -1 && year != -1) { /* Set the year */ ucal_set(c, UCAL_YEAR, year); /* Determine the first day of the week */ fdow = ucal_getAttribute(c, UCAL_FIRST_DAY_OF_WEEK); /* Print the calendar for the year */ print_year(c, days, months, useLongNames, fdow, status); } /* Print only one month */ else { /* Set the month and the year, if specified */ if(month != -1) ucal_set(c, UCAL_MONTH, month); if(year != -1) ucal_set(c, UCAL_YEAR, year); /* Determine the first day of the week */ fdow = ucal_getAttribute(c, UCAL_FIRST_DAY_OF_WEEK); /* Print the calendar for the month */ print_month(c, days, useLongNames, fdow, status); } /* Clean up */ ucal_close(c); }
RSExport RSIndex RSCalendarGetMinimumDaysInFirstWeek(RSCalendarRef calendar) { RS_OBJC_FUNCDISPATCHV(RSCalendarGetTypeID(), RSIndex, calendar, minimumDaysInFirstWeek); __RSGenericValidInstance(calendar, RSCalendarGetTypeID()); if (!calendar->_cal) __RSCalendarSetupCal(calendar); return calendar->_cal ? ucal_getAttribute(calendar->_cal, UCAL_MINIMAL_DAYS_IN_FIRST_WEEK) : -1; }
static unsigned getFirstDayOfWeek() { ScopedDateFormat dateFormat; if (!dateFormat.get()) return 0; unsigned firstDay = ucal_getAttribute(udat_getCalendar(dateFormat.get()), UCAL_FIRST_DAY_OF_WEEK) - UCAL_SUNDAY; return firstDay; }
CFIndex CFCalendarGetFirstWeekday(CFCalendarRef calendar) { CF_OBJC_FUNCDISPATCHV(CFCalendarGetTypeID(), CFIndex, calendar, firstWeekday); __CFGenericValidateType(calendar, CFCalendarGetTypeID()); if (!calendar->_cal) __CFCalendarSetupCal(calendar); if (calendar->_cal) { return ucal_getAttribute(calendar->_cal, UCAL_FIRST_DAY_OF_WEEK); } return -1; }
RSExport RSIndex RSCalendarGetFirstWeekday(RSCalendarRef calendar) { RS_OBJC_FUNCDISPATCHV(RSCalendarGetTypeID(), RSIndex, calendar, firstWeekday); __RSGenericValidInstance(calendar, __RSCalendarTypeID); if (!calendar->_cal) __RSCalendarSetupCal(calendar); if (calendar->_cal) { return ucal_getAttribute(calendar->_cal, UCAL_FIRST_DAY_OF_WEEK); } return -1; }
void LocaleICU::initializeCalendar() { if (m_weekDayShortLabels) return; if (!initializeShortDateFormat()) { m_firstDayOfWeek = 0; m_weekDayShortLabels = createFallbackWeekDayShortLabels(); return; } m_firstDayOfWeek = ucal_getAttribute(udat_getCalendar(m_shortDateFormat), UCAL_FIRST_DAY_OF_WEEK) - UCAL_SUNDAY; m_weekDayShortLabels = createLabelVector(m_shortDateFormat, UDAT_SHORT_WEEKDAYS, UCAL_SUNDAY, 7); if (!m_weekDayShortLabels) m_weekDayShortLabels = createFallbackWeekDayShortLabels(); }
CFIndex CFCalendarGetMinimumDaysInFirstWeek(CFCalendarRef calendar) { CF_OBJC_FUNCDISPATCHV(CFCalendarGetTypeID(), CFIndex, calendar, minimumDaysInFirstWeek); __CFGenericValidateType(calendar, CFCalendarGetTypeID()); if (!calendar->_cal) __CFCalendarSetupCal(calendar); return calendar->_cal ? ucal_getAttribute(calendar->_cal, UCAL_MINIMAL_DAYS_IN_FIRST_WEEK) : -1; }
static void __CFCalendarSetToFirstInstant(CFCalendarRef calendar, CFCalendarUnit unit, CFAbsoluteTime at) { // Set UCalendar to first instant of unit prior to 'at' UErrorCode status = U_ZERO_ERROR; UDate udate = floor((at + kCFAbsoluteTimeIntervalSince1970) * 1000.0); ucal_setMillis(calendar->_cal, udate, &status); int target_era = INT_MIN; switch (unit) { // largest to smallest, we set the fields to their minimum value case kCFCalendarUnitWeek: { // reduce to first day of week, then reduce the rest of the day int32_t goal = ucal_getAttribute(calendar->_cal, UCAL_FIRST_DAY_OF_WEEK); int32_t dow = ucal_get(calendar->_cal, UCAL_DAY_OF_WEEK, &status); while (dow != goal) { ucal_add(calendar->_cal, UCAL_DAY_OF_MONTH, -1, &status); dow = ucal_get(calendar->_cal, UCAL_DAY_OF_WEEK, &status); } goto day; } case kCFCalendarUnitEra: { target_era = ucal_get(calendar->_cal, UCAL_ERA, &status); ucal_set(calendar->_cal, UCAL_YEAR, ucal_getLimit(calendar->_cal, UCAL_YEAR, UCAL_ACTUAL_MINIMUM, &status)); } case kCFCalendarUnitYear: ucal_set(calendar->_cal, UCAL_MONTH, ucal_getLimit(calendar->_cal, UCAL_MONTH, UCAL_ACTUAL_MINIMUM, &status)); case kCFCalendarUnitMonth: ucal_set(calendar->_cal, UCAL_DAY_OF_MONTH, ucal_getLimit(calendar->_cal, UCAL_DAY_OF_MONTH, UCAL_ACTUAL_MINIMUM, &status)); case kCFCalendarUnitWeekday: case kCFCalendarUnitDay: day:; ucal_set(calendar->_cal, UCAL_HOUR_OF_DAY, ucal_getLimit(calendar->_cal, UCAL_HOUR_OF_DAY, UCAL_ACTUAL_MINIMUM, &status)); case kCFCalendarUnitHour: ucal_set(calendar->_cal, UCAL_MINUTE, ucal_getLimit(calendar->_cal, UCAL_MINUTE, UCAL_ACTUAL_MINIMUM, &status)); case kCFCalendarUnitMinute: ucal_set(calendar->_cal, UCAL_SECOND, ucal_getLimit(calendar->_cal, UCAL_SECOND, UCAL_ACTUAL_MINIMUM, &status)); case kCFCalendarUnitSecond: ucal_set(calendar->_cal, UCAL_MILLISECOND, 0); } if (INT_MIN != target_era && ucal_get(calendar->_cal, UCAL_ERA, &status) < target_era) { // In the Japanese calendar, and possibly others, eras don't necessarily // start on the first day of a year, so the previous code may have backed // up into the previous era, and we have to correct forward. UDate bad_udate = ucal_getMillis(calendar->_cal, &status); ucal_add(calendar->_cal, UCAL_MONTH, 1, &status); while (ucal_get(calendar->_cal, UCAL_ERA, &status) < target_era) { bad_udate = ucal_getMillis(calendar->_cal, &status); ucal_add(calendar->_cal, UCAL_MONTH, 1, &status); } udate = ucal_getMillis(calendar->_cal, &status); // target date is between bad_udate and udate for (;;) { UDate test_udate = (udate + bad_udate) / 2; ucal_setMillis(calendar->_cal, test_udate, &status); if (ucal_get(calendar->_cal, UCAL_ERA, &status) < target_era) { bad_udate = test_udate; } else { udate = test_udate; } if (fabs(udate - bad_udate) < 1000) break; } do { bad_udate = floor((bad_udate + 1000) / 1000) * 1000; ucal_setMillis(calendar->_cal, bad_udate, &status); } while (ucal_get(calendar->_cal, UCAL_ERA, &status) < target_era); } }
/* PAL Function: GetLocaleInfoInt Obtains integer locale information Returns 1 for success, 0 otherwise */ extern "C" int32_t GlobalizationNative_GetLocaleInfoInt( const UChar* localeName, LocaleNumberData localeNumberData, int32_t* value) { UErrorCode status = U_ZERO_ERROR; char locale[ULOC_FULLNAME_CAPACITY]; GetLocale(localeName, locale, ULOC_FULLNAME_CAPACITY, false, &status); if (U_FAILURE(status)) { return UErrorCodeToBool(U_ILLEGAL_ARGUMENT_ERROR); } switch (localeNumberData) { case LanguageId: *value = uloc_getLCID(locale); break; case MeasurementSystem: status = GetMeasurementSystem(locale, value); break; case FractionalDigitsCount: { UNumberFormat* numformat = unum_open(UNUM_DECIMAL, NULL, 0, locale, NULL, &status); if (U_SUCCESS(status)) { *value = unum_getAttribute(numformat, UNUM_MAX_FRACTION_DIGITS); unum_close(numformat); } break; } case NegativeNumberFormat: *value = GetNumberNegativePattern(locale); break; case MonetaryFractionalDigitsCount: { UNumberFormat* numformat = unum_open(UNUM_CURRENCY, NULL, 0, locale, NULL, &status); if (U_SUCCESS(status)) { *value = unum_getAttribute(numformat, UNUM_MAX_FRACTION_DIGITS); unum_close(numformat); } break; } case PositiveMonetaryNumberFormat: *value = GetCurrencyPositivePattern(locale); break; case NegativeMonetaryNumberFormat: *value = GetCurrencyNegativePattern(locale); break; case FirstWeekOfYear: { // corresponds to DateTimeFormat.CalendarWeekRule UCalendar* pCal = ucal_open(nullptr, 0, locale, UCAL_TRADITIONAL, &status); UCalendarHolder calHolder(pCal, status); if (U_SUCCESS(status)) { // values correspond to LOCALE_IFIRSTWEEKOFYEAR int minDaysInWeek = ucal_getAttribute(pCal, UCAL_MINIMAL_DAYS_IN_FIRST_WEEK); if (minDaysInWeek == 1) { *value = CalendarWeekRule::FirstDay; } else if (minDaysInWeek == 7) { *value = CalendarWeekRule::FirstFullWeek; } else if (minDaysInWeek >= 4) { *value = CalendarWeekRule::FirstFourDayWeek; } else { status = U_UNSUPPORTED_ERROR; } } break; } case ReadingLayout: { // coresponds to values 0 and 1 in LOCALE_IREADINGLAYOUT (values 2 and 3 not // used in coreclr) // 0 - Left to right (such as en-US) // 1 - Right to left (such as arabic locales) ULayoutType orientation = uloc_getCharacterOrientation(locale, &status); // alternative implementation in ICU 54+ is uloc_isRightToLeft() which // also supports script tags in locale if (U_SUCCESS(status)) { *value = (orientation == ULOC_LAYOUT_RTL) ? 1 : 0; } break; } case FirstDayofWeek: { UCalendar* pCal = ucal_open(nullptr, 0, locale, UCAL_TRADITIONAL, &status); UCalendarHolder calHolder(pCal, status); if (U_SUCCESS(status)) { *value = ucal_getAttribute(pCal, UCAL_FIRST_DAY_OF_WEEK) - 1; // .NET is 0-based and ICU is 1-based } break; } case NegativePercentFormat: *value = GetPercentNegativePattern(locale); break; case PositivePercentFormat: *value = GetPercentPositivePattern(locale); break; default: status = U_UNSUPPORTED_ERROR; assert(false); break; } return UErrorCodeToBool(status); }