185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/*
285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho*******************************************************************************
385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho* Copyright (C) 2003 - 2009, International Business Machines Corporation and  *
485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho* others. All Rights Reserved.                                                *
585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho*******************************************************************************
685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho*/
785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/utypes.h"
985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if !UCONFIG_NO_FORMATTING
1185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "cecal.h"
1385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "gregoimp.h"   //Math
1485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1585bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_NAMESPACE_BEGIN
1685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic const int32_t LIMITS[UCAL_FIELD_COUNT][4] = {
1885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    // Minimum  Greatest    Least  Maximum
1985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    //           Minimum  Maximum
2085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {        0,        0,        1,        1}, // ERA
2185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {        1,        1,  5000000,  5000000}, // YEAR
2285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {        0,        0,       12,       12}, // MONTH
2385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {        1,        1,       52,       53}, // WEEK_OF_YEAR
2485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // WEEK_OF_MONTH
2585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {        1,        1,        5,       30}, // DAY_OF_MONTH
2685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {        1,        1,      365,      366}, // DAY_OF_YEAR
2785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DAY_OF_WEEK
2885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {       -1,       -1,        1,        5}, // DAY_OF_WEEK_IN_MONTH
2985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // AM_PM
3085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // HOUR
3185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // HOUR_OF_DAY
3285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MINUTE
3385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // SECOND
3485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MILLISECOND
3585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // ZONE_OFFSET
3685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DST_OFFSET
3785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    { -5000000, -5000000,  5000000,  5000000}, // YEAR_WOY
3885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DOW_LOCAL
3985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    { -5000000, -5000000,  5000000,  5000000}, // EXTENDED_YEAR
4085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // JULIAN_DAY
4185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MILLISECONDS_IN_DAY
4285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // IS_LEAP_MONTH
4385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho};
4485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
4585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//-------------------------------------------------------------------------
4685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho// Constructors...
4785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//-------------------------------------------------------------------------
4885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
4985bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::CECalendar(const Locale& aLocale, UErrorCode& success)
5085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho:   Calendar(TimeZone::createDefault(), aLocale, success)
5185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{
5285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    setTimeInMillis(getNow(), success);
5385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
5485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
5585bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::CECalendar (const CECalendar& other)
5685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho:   Calendar(other)
5785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{
5885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
5985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
6085bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::~CECalendar()
6185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{
6285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
6385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
6485bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar&
6585bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::operator=(const CECalendar& right)
6685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{
6785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    Calendar::operator=(right);
6885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    return *this;
6985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
7085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
7185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//-------------------------------------------------------------------------
7285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho// Calendar framework
7385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//-------------------------------------------------------------------------
7485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
7585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoint32_t
7685bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::handleComputeMonthStart(int32_t eyear,int32_t emonth, UBool /*useMonth*/) const
7785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{
7885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    return ceToJD(eyear, emonth, 0, getJDEpochOffset());
7985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
8085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
8185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoint32_t
8285bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const
8385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{
8485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    return LIMITS[field][limitType];
8585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
8685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
8785bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoUBool
8885bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::inDaylightTime(UErrorCode& status) const
8985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{
9085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (U_FAILURE(status) || !getTimeZone().useDaylightTime()) {
9185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return FALSE;
9285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
9385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
9485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    // Force an update of the state of the Calendar.
9585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ((CECalendar*)this)->complete(status); // cast away const
9685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
9785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    return (UBool)(U_SUCCESS(status) ? (internalGet(UCAL_DST_OFFSET) != 0) : FALSE);
9885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
9985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
10085bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoUBool
10185bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::haveDefaultCentury() const
10285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{
10385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    return TRUE;
10485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
10585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
10685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//-------------------------------------------------------------------------
10785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho// Calendar system Conversion methods...
10885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//-------------------------------------------------------------------------
10985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoint32_t
11085bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::ceToJD(int32_t year, int32_t month, int32_t date, int32_t jdEpochOffset)
11185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{
11285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    // handle month > 12, < 0 (e.g. from add/set)
11385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if ( month >= 0 ) {
11485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        year += month/13;
11585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        month %= 13;
11685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    } else {
11785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ++month;
11885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        year += month/13 - 1;
11985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        month = month%13 + 12;
12085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
12185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    return (int32_t) (
12285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        jdEpochOffset                   // difference from Julian epoch to 1,1,1
12385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        + 365 * year                    // number of days from years
12485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        + ClockMath::floorDivide(year, 4)    // extra day of leap year
12585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        + 30 * month                    // number of days from months (months are 0-based)
12685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        + date - 1                      // number of days for present month (1 based)
12785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        );
12885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
12985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
13085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hovoid
13185bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::jdToCE(int32_t julianDay, int32_t jdEpochOffset, int32_t& year, int32_t& month, int32_t& day)
13285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{
13385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t c4; // number of 4 year cycle (1461 days)
13485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t r4; // remainder of 4 year cycle, always positive
13585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
13685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    c4 = ClockMath::floorDivide(julianDay - jdEpochOffset, 1461, r4);
13785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
13885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    year = 4 * c4 + (r4/365 - r4/1460); // 4 * <number of 4year cycle> + <years within the last cycle>
13985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
14085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t doy = (r4 == 1460) ? 365 : (r4 % 365); // days in present year
14185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
14285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    month = doy / 30;       // 30 -> Coptic/Ethiopic month length up to 12th month
14385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    day = (doy % 30) + 1;   // 1-based days in a month
14485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
14585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
14685bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_NAMESPACE_END
14785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
14885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif /* #if !UCONFIG_NO_FORMATTING */
14985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//eof
150