aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/icu/i18n/cecal.cpp
blob: b21607a6f3d4373fae5324012dde52869421c11b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html 
/* 
******************************************************************************* 
* Copyright (C) 2003 - 2009, International Business Machines Corporation and  * 
* others. All Rights Reserved.                                                * 
******************************************************************************* 
*/ 
 
#include "unicode/utypes.h" 
 
#if !UCONFIG_NO_FORMATTING 
 
#include "cecal.h" 
#include "gregoimp.h"   //Math 
 
U_NAMESPACE_BEGIN 
 
static const int32_t LIMITS[UCAL_FIELD_COUNT][4] = { 
    // Minimum  Greatest    Least  Maximum 
    //           Minimum  Maximum 
    {        0,        0,        1,        1}, // ERA 
    {        1,        1,  5000000,  5000000}, // YEAR 
    {        0,        0,       12,       12}, // MONTH 
    {        1,        1,       52,       53}, // WEEK_OF_YEAR 
    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // WEEK_OF_MONTH 
    {        1,        1,        5,       30}, // DAY_OF_MONTH 
    {        1,        1,      365,      366}, // DAY_OF_YEAR 
    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DAY_OF_WEEK 
    {       -1,       -1,        1,        5}, // DAY_OF_WEEK_IN_MONTH 
    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // AM_PM 
    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // HOUR 
    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // HOUR_OF_DAY 
    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MINUTE 
    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // SECOND 
    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MILLISECOND 
    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // ZONE_OFFSET 
    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DST_OFFSET 
    { -5000000, -5000000,  5000000,  5000000}, // YEAR_WOY 
    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DOW_LOCAL 
    { -5000000, -5000000,  5000000,  5000000}, // EXTENDED_YEAR 
    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // JULIAN_DAY 
    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MILLISECONDS_IN_DAY 
    {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // IS_LEAP_MONTH 
}; 
 
//------------------------------------------------------------------------- 
// Constructors... 
//------------------------------------------------------------------------- 
 
CECalendar::CECalendar(const Locale& aLocale, UErrorCode& success) 
:   Calendar(TimeZone::createDefault(), aLocale, success) 
{ 
    setTimeInMillis(getNow(), success); 
} 
 
CECalendar::CECalendar (const CECalendar& other)  
:   Calendar(other) 
{ 
} 
 
CECalendar::~CECalendar() 
{ 
} 
 
CECalendar& 
CECalendar::operator=(const CECalendar& right) 
{ 
    Calendar::operator=(right); 
    return *this; 
} 
 
//------------------------------------------------------------------------- 
// Calendar framework 
//------------------------------------------------------------------------- 
 
int32_t 
CECalendar::handleComputeMonthStart(int32_t eyear,int32_t emonth, UBool /*useMonth*/) const 
{ 
    return ceToJD(eyear, emonth, 0, getJDEpochOffset()); 
} 
 
int32_t 
CECalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const 
{ 
    return LIMITS[field][limitType]; 
} 
 
UBool 
CECalendar::inDaylightTime(UErrorCode& status) const 
{ 
    if (U_FAILURE(status) || !getTimeZone().useDaylightTime()) { 
        return FALSE; 
    } 
 
    // Force an update of the state of the Calendar. 
    ((CECalendar*)this)->complete(status); // cast away const 
 
    return (UBool)(U_SUCCESS(status) ? (internalGet(UCAL_DST_OFFSET) != 0) : FALSE); 
} 
 
UBool 
CECalendar::haveDefaultCentury() const 
{ 
    return TRUE; 
} 
 
//------------------------------------------------------------------------- 
// Calendar system Conversion methods... 
//------------------------------------------------------------------------- 
int32_t 
CECalendar::ceToJD(int32_t year, int32_t month, int32_t date, int32_t jdEpochOffset) 
{ 
    // handle month > 12, < 0 (e.g. from add/set) 
    if ( month >= 0 ) { 
        year += month/13; 
        month %= 13; 
    } else { 
        ++month; 
        year += month/13 - 1; 
        month = month%13 + 12; 
    } 
    return (int32_t) ( 
        jdEpochOffset                   // difference from Julian epoch to 1,1,1 
        + 365 * year                    // number of days from years 
        + ClockMath::floorDivide(year, 4)    // extra day of leap year 
        + 30 * month                    // number of days from months (months are 0-based) 
        + date - 1                      // number of days for present month (1 based) 
        ); 
} 
 
void 
CECalendar::jdToCE(int32_t julianDay, int32_t jdEpochOffset, int32_t& year, int32_t& month, int32_t& day) 
{ 
    int32_t c4; // number of 4 year cycle (1461 days) 
    int32_t r4; // remainder of 4 year cycle, always positive 
 
    c4 = ClockMath::floorDivide(julianDay - jdEpochOffset, 1461, r4); 
 
    year = 4 * c4 + (r4/365 - r4/1460); // 4 * <number of 4year cycle> + <years within the last cycle> 
 
    int32_t doy = (r4 == 1460) ? 365 : (r4 % 365); // days in present year 
 
    month = doy / 30;       // 30 -> Coptic/Ethiopic month length up to 12th month 
    day = (doy % 30) + 1;   // 1-based days in a month 
} 
 
U_NAMESPACE_END 
 
#endif /* #if !UCONFIG_NO_FORMATTING */ 
//eof