1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
5 namespace System
.Globalization
8 /// Calendar support range:
9 /// Calendar Minimum Maximum
10 /// ========== ========== ==========
11 /// Gregorian 1912/02/18 2051/02/10
12 /// TaiwanLunisolar 1912/01/01 2050/13/29
14 public class TaiwanLunisolarCalendar
: EastAsianLunisolarCalendar
17 // Gregorian Year = Era Year + yearOffset
18 // When Gregorian Year 1912 is year 1, so that
19 // 1912 = 1 + yearOffset
20 // So yearOffset = 1911
21 private static readonly EraInfo
[] s_taiwanLunisolarEraInfo
= new EraInfo
[]
23 new EraInfo(1, 1912, 1, 1, 1911, 1, GregorianCalendar
.MaxYear
- 1911) // era #, start year/month/day, yearOffset, minEraYear
26 private readonly GregorianCalendarHelper _helper
;
28 private const int MinLunisolarYear
= 1912;
29 private const int MaxLunisolarYear
= 2050;
31 private static readonly DateTime s_minDate
= new DateTime(1912, 2, 18);
32 private static readonly DateTime s_maxDate
= new DateTime((new DateTime(2051, 2, 10, 23, 59, 59, 999)).Ticks
+ 9999);
34 public override DateTime MinSupportedDateTime
=> s_minDate
;
36 public override DateTime MaxSupportedDateTime
=> s_maxDate
;
38 protected override int DaysInYearBeforeMinSupportedYear
=>
39 // 1911 from ChineseLunisolarCalendar
42 private static readonly int[,] s_yinfo
=
44 /*Y LM Lmon Lday DaysPerMonth D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 #Days
46 { 0, 2, 18, 42192 }
, /* 30 29 30 29 29 30 29 29 30 30 29 30 0 354
47 1913 */{ 0, 2, 6, 53840 }
, /* 30 30 29 30 29 29 30 29 29 30 29 30 0 354
48 1914 */{ 5, 1, 26, 54568 }
, /* 30 30 29 30 29 30 29 30 29 29 30 29 30 384
49 1915 */{ 0, 2, 14, 46400 }
, /* 30 29 30 30 29 30 29 30 29 30 29 29 0 354
50 1916 */{ 0, 2, 3, 54944 }
, /* 30 30 29 30 29 30 30 29 30 29 30 29 0 355
51 1917 */{ 2, 1, 23, 38608 }
, /* 30 29 29 30 29 30 30 29 30 30 29 30 29 384
52 1918 */{ 0, 2, 11, 38320 }
, /* 30 29 29 30 29 30 29 30 30 29 30 30 0 355
53 1919 */{ 7, 2, 1, 18872 }
, /* 29 30 29 29 30 29 29 30 30 29 30 30 30 384
54 1920 */{ 0, 2, 20, 18800 }
, /* 29 30 29 29 30 29 29 30 29 30 30 30 0 354
55 1921 */{ 0, 2, 8, 42160 }
, /* 30 29 30 29 29 30 29 29 30 29 30 30 0 354
56 1922 */{ 5, 1, 28, 45656 }
, /* 30 29 30 30 29 29 30 29 29 30 29 30 30 384
57 1923 */{ 0, 2, 16, 27216 }
, /* 29 30 30 29 30 29 30 29 29 30 29 30 0 354
58 1924 */{ 0, 2, 5, 27968 }
, /* 29 30 30 29 30 30 29 30 29 30 29 29 0 354
59 1925 */{ 4, 1, 24, 44456 }
, /* 30 29 30 29 30 30 29 30 30 29 30 29 30 385
60 1926 */{ 0, 2, 13, 11104 }
, /* 29 29 30 29 30 29 30 30 29 30 30 29 0 354
61 1927 */{ 0, 2, 2, 38256 }
, /* 30 29 29 30 29 30 29 30 29 30 30 30 0 355
62 1928 */{ 2, 1, 23, 18808 }
, /* 29 30 29 29 30 29 29 30 29 30 30 30 30 384
63 1929 */{ 0, 2, 10, 18800 }
, /* 29 30 29 29 30 29 29 30 29 30 30 30 0 354
64 1930 */{ 6, 1, 30, 25776 }
, /* 29 30 30 29 29 30 29 29 30 29 30 30 29 383
65 1931 */{ 0, 2, 17, 54432 }
, /* 30 30 29 30 29 30 29 29 30 29 30 29 0 354
66 1932 */{ 0, 2, 6, 59984 }
, /* 30 30 30 29 30 29 30 29 29 30 29 30 0 355
67 1933 */{ 5, 1, 26, 27976 }
, /* 29 30 30 29 30 30 29 30 29 30 29 29 30 384
68 1934 */{ 0, 2, 14, 23248 }
, /* 29 30 29 30 30 29 30 29 30 30 29 30 0 355
69 1935 */{ 0, 2, 4, 11104 }
, /* 29 29 30 29 30 29 30 30 29 30 30 29 0 354
70 1936 */{ 3, 1, 24, 37744 }
, /* 30 29 29 30 29 29 30 30 29 30 30 30 29 384
71 1937 */{ 0, 2, 11, 37600 }
, /* 30 29 29 30 29 29 30 29 30 30 30 29 0 354
72 1938 */{ 7, 1, 31, 51560 }
, /* 30 30 29 29 30 29 29 30 29 30 30 29 30 384
73 1939 */{ 0, 2, 19, 51536 }
, /* 30 30 29 29 30 29 29 30 29 30 29 30 0 354
74 1940 */{ 0, 2, 8, 54432 }
, /* 30 30 29 30 29 30 29 29 30 29 30 29 0 354
75 1941 */{ 6, 1, 27, 55888 }
, /* 30 30 29 30 30 29 30 29 29 30 29 30 29 384
76 1942 */{ 0, 2, 15, 46416 }
, /* 30 29 30 30 29 30 29 30 29 30 29 30 0 355
77 1943 */{ 0, 2, 5, 22176 }
, /* 29 30 29 30 29 30 30 29 30 29 30 29 0 354
78 1944 */{ 4, 1, 25, 43736 }
, /* 30 29 30 29 30 29 30 29 30 30 29 30 30 385
79 1945 */{ 0, 2, 13, 9680 }
, /* 29 29 30 29 29 30 29 30 30 30 29 30 0 354
80 1946 */{ 0, 2, 2, 37584 }
, /* 30 29 29 30 29 29 30 29 30 30 29 30 0 354
81 1947 */{ 2, 1, 22, 51544 }
, /* 30 30 29 29 30 29 29 30 29 30 29 30 30 384
82 1948 */{ 0, 2, 10, 43344 }
, /* 30 29 30 29 30 29 29 30 29 30 29 30 0 354
83 1949 */{ 7, 1, 29, 46248 }
, /* 30 29 30 30 29 30 29 29 30 29 30 29 30 384
84 1950 */{ 0, 2, 17, 27808 }
, /* 29 30 30 29 30 30 29 29 30 29 30 29 0 354
85 1951 */{ 0, 2, 6, 46416 }
, /* 30 29 30 30 29 30 29 30 29 30 29 30 0 355
86 1952 */{ 5, 1, 27, 21928 }
, /* 29 30 29 30 29 30 29 30 30 29 30 29 30 384
87 1953 */{ 0, 2, 14, 19872 }
, /* 29 30 29 29 30 30 29 30 30 29 30 29 0 354
88 1954 */{ 0, 2, 3, 42416 }
, /* 30 29 30 29 29 30 29 30 30 29 30 30 0 355
89 1955 */{ 3, 1, 24, 21176 }
, /* 29 30 29 30 29 29 30 29 30 29 30 30 30 384
90 1956 */{ 0, 2, 12, 21168 }
, /* 29 30 29 30 29 29 30 29 30 29 30 30 0 354
91 1957 */{ 8, 1, 31, 43344 }
, /* 30 29 30 29 30 29 29 30 29 30 29 30 29 383
92 1958 */{ 0, 2, 18, 59728 }
, /* 30 30 30 29 30 29 29 30 29 30 29 30 0 355
93 1959 */{ 0, 2, 8, 27296 }
, /* 29 30 30 29 30 29 30 29 30 29 30 29 0 354
94 1960 */{ 6, 1, 28, 44368 }
, /* 30 29 30 29 30 30 29 30 29 30 29 30 29 384
95 1961 */{ 0, 2, 15, 43856 }
, /* 30 29 30 29 30 29 30 30 29 30 29 30 0 355
96 1962 */{ 0, 2, 5, 19296 }
, /* 29 30 29 29 30 29 30 30 29 30 30 29 0 354
97 1963 */{ 4, 1, 25, 42352 }
, /* 30 29 30 29 29 30 29 30 29 30 30 30 29 384
98 1964 */{ 0, 2, 13, 42352 }
, /* 30 29 30 29 29 30 29 30 29 30 30 30 0 355
99 1965 */{ 0, 2, 2, 21088 }
, /* 29 30 29 30 29 29 30 29 29 30 30 29 0 353
100 1966 */{ 3, 1, 21, 59696 }
, /* 30 30 30 29 30 29 29 30 29 29 30 30 29 384
101 1967 */{ 0, 2, 9, 55632 }
, /* 30 30 29 30 30 29 29 30 29 30 29 30 0 355
102 1968 */{ 7, 1, 30, 23208 }
, /* 29 30 29 30 30 29 30 29 30 29 30 29 30 384
103 1969 */{ 0, 2, 17, 22176 }
, /* 29 30 29 30 29 30 30 29 30 29 30 29 0 354
104 1970 */{ 0, 2, 6, 38608 }
, /* 30 29 29 30 29 30 30 29 30 30 29 30 0 355
105 1971 */{ 5, 1, 27, 19176 }
, /* 29 30 29 29 30 29 30 29 30 30 30 29 30 384
106 1972 */{ 0, 2, 15, 19152 }
, /* 29 30 29 29 30 29 30 29 30 30 29 30 0 354
107 1973 */{ 0, 2, 3, 42192 }
, /* 30 29 30 29 29 30 29 29 30 30 29 30 0 354
108 1974 */{ 4, 1, 23, 53864 }
, /* 30 30 29 30 29 29 30 29 29 30 30 29 30 384
109 1975 */{ 0, 2, 11, 53840 }
, /* 30 30 29 30 29 29 30 29 29 30 29 30 0 354
110 1976 */{ 8, 1, 31, 54568 }
, /* 30 30 29 30 29 30 29 30 29 29 30 29 30 384
111 1977 */{ 0, 2, 18, 46400 }
, /* 30 29 30 30 29 30 29 30 29 30 29 29 0 354
112 1978 */{ 0, 2, 7, 46752 }
, /* 30 29 30 30 29 30 30 29 30 29 30 29 0 355
113 1979 */{ 6, 1, 28, 38608 }
, /* 30 29 29 30 29 30 30 29 30 30 29 30 29 384
114 1980 */{ 0, 2, 16, 38320 }
, /* 30 29 29 30 29 30 29 30 30 29 30 30 0 355
115 1981 */{ 0, 2, 5, 18864 }
, /* 29 30 29 29 30 29 29 30 30 29 30 30 0 354
116 1982 */{ 4, 1, 25, 42168 }
, /* 30 29 30 29 29 30 29 29 30 29 30 30 30 384
117 1983 */{ 0, 2, 13, 42160 }
, /* 30 29 30 29 29 30 29 29 30 29 30 30 0 354
118 1984 */{ 10, 2, 2, 45656 }
, /* 30 29 30 30 29 29 30 29 29 30 29 30 30 384
119 1985 */{ 0, 2, 20, 27216 }
, /* 29 30 30 29 30 29 30 29 29 30 29 30 0 354
120 1986 */{ 0, 2, 9, 27968 }
, /* 29 30 30 29 30 30 29 30 29 30 29 29 0 354
121 1987 */{ 6, 1, 29, 44448 }
, /* 30 29 30 29 30 30 29 30 30 29 30 29 29 384
122 1988 */{ 0, 2, 17, 43872 }
, /* 30 29 30 29 30 29 30 30 29 30 30 29 0 355
123 1989 */{ 0, 2, 6, 38256 }
, /* 30 29 29 30 29 30 29 30 29 30 30 30 0 355
124 1990 */{ 5, 1, 27, 18808 }
, /* 29 30 29 29 30 29 29 30 29 30 30 30 30 384
125 1991 */{ 0, 2, 15, 18800 }
, /* 29 30 29 29 30 29 29 30 29 30 30 30 0 354
126 1992 */{ 0, 2, 4, 25776 }
, /* 29 30 30 29 29 30 29 29 30 29 30 30 0 354
127 1993 */{ 3, 1, 23, 27216 }
, /* 29 30 30 29 30 29 30 29 29 30 29 30 29 383
128 1994 */{ 0, 2, 10, 59984 }
, /* 30 30 30 29 30 29 30 29 29 30 29 30 0 355
129 1995 */{ 8, 1, 31, 27432 }
, /* 29 30 30 29 30 29 30 30 29 29 30 29 30 384
130 1996 */{ 0, 2, 19, 23232 }
, /* 29 30 29 30 30 29 30 29 30 30 29 29 0 354
131 1997 */{ 0, 2, 7, 43872 }
, /* 30 29 30 29 30 29 30 30 29 30 30 29 0 355
132 1998 */{ 5, 1, 28, 37736 }
, /* 30 29 29 30 29 29 30 30 29 30 30 29 30 384
133 1999 */{ 0, 2, 16, 37600 }
, /* 30 29 29 30 29 29 30 29 30 30 30 29 0 354
134 2000 */{ 0, 2, 5, 51552 }
, /* 30 30 29 29 30 29 29 30 29 30 30 29 0 354
135 2001 */{ 4, 1, 24, 54440 }
, /* 30 30 29 30 29 30 29 29 30 29 30 29 30 384
136 2002 */{ 0, 2, 12, 54432 }
, /* 30 30 29 30 29 30 29 29 30 29 30 29 0 354
137 2003 */{ 0, 2, 1, 55888 }
, /* 30 30 29 30 30 29 30 29 29 30 29 30 0 355
138 2004 */{ 2, 1, 22, 23208 }
, /* 29 30 29 30 30 29 30 29 30 29 30 29 30 384
139 2005 */{ 0, 2, 9, 22176 }
, /* 29 30 29 30 29 30 30 29 30 29 30 29 0 354
140 2006 */{ 7, 1, 29, 43736 }
, /* 30 29 30 29 30 29 30 29 30 30 29 30 30 385
141 2007 */{ 0, 2, 18, 9680 }
, /* 29 29 30 29 29 30 29 30 30 30 29 30 0 354
142 2008 */{ 0, 2, 7, 37584 }
, /* 30 29 29 30 29 29 30 29 30 30 29 30 0 354
143 2009 */{ 5, 1, 26, 51544 }
, /* 30 30 29 29 30 29 29 30 29 30 29 30 30 384
144 2010 */{ 0, 2, 14, 43344 }
, /* 30 29 30 29 30 29 29 30 29 30 29 30 0 354
145 2011 */{ 0, 2, 3, 46240 }
, /* 30 29 30 30 29 30 29 29 30 29 30 29 0 354
146 2012 */{ 4, 1, 23, 46416 }
, /* 30 29 30 30 29 30 29 30 29 30 29 30 29 384
147 2013 */{ 0, 2, 10, 44368 }
, /* 30 29 30 29 30 30 29 30 29 30 29 30 0 355
148 2014 */{ 9, 1, 31, 21928 }
, /* 29 30 29 30 29 30 29 30 30 29 30 29 30 384
149 2015 */{ 0, 2, 19, 19360 }
, /* 29 30 29 29 30 29 30 30 30 29 30 29 0 354
150 2016 */{ 0, 2, 8, 42416 }
, /* 30 29 30 29 29 30 29 30 30 29 30 30 0 355
151 2017 */{ 6, 1, 28, 21176 }
, /* 29 30 29 30 29 29 30 29 30 29 30 30 30 384
152 2018 */{ 0, 2, 16, 21168 }
, /* 29 30 29 30 29 29 30 29 30 29 30 30 0 354
153 2019 */{ 0, 2, 5, 43312 }
, /* 30 29 30 29 30 29 29 30 29 29 30 30 0 354
154 2020 */{ 4, 1, 25, 29864 }
, /* 29 30 30 30 29 30 29 29 30 29 30 29 30 384
155 2021 */{ 0, 2, 12, 27296 }
, /* 29 30 30 29 30 29 30 29 30 29 30 29 0 354
156 2022 */{ 0, 2, 1, 44368 }
, /* 30 29 30 29 30 30 29 30 29 30 29 30 0 355
157 2023 */{ 2, 1, 22, 19880 }
, /* 29 30 29 29 30 30 29 30 30 29 30 29 30 384
158 2024 */{ 0, 2, 10, 19296 }
, /* 29 30 29 29 30 29 30 30 29 30 30 29 0 354
159 2025 */{ 6, 1, 29, 42352 }
, /* 30 29 30 29 29 30 29 30 29 30 30 30 29 384
160 2026 */{ 0, 2, 17, 42208 }
, /* 30 29 30 29 29 30 29 29 30 30 30 29 0 354
161 2027 */{ 0, 2, 6, 53856 }
, /* 30 30 29 30 29 29 30 29 29 30 30 29 0 354
162 2028 */{ 5, 1, 26, 59696 }
, /* 30 30 30 29 30 29 29 30 29 29 30 30 29 384
163 2029 */{ 0, 2, 13, 54576 }
, /* 30 30 29 30 29 30 29 30 29 29 30 30 0 355
164 2030 */{ 0, 2, 3, 23200 }
, /* 29 30 29 30 30 29 30 29 30 29 30 29 0 354
165 2031 */{ 3, 1, 23, 27472 }
, /* 29 30 30 29 30 29 30 30 29 30 29 30 29 384
166 2032 */{ 0, 2, 11, 38608 }
, /* 30 29 29 30 29 30 30 29 30 30 29 30 0 355
167 2033 */{ 11, 1, 31, 19176 }
, /* 29 30 29 29 30 29 30 29 30 30 30 29 30 384
168 2034 */{ 0, 2, 19, 19152 }
, /* 29 30 29 29 30 29 30 29 30 30 29 30 0 354
169 2035 */{ 0, 2, 8, 42192 }
, /* 30 29 30 29 29 30 29 29 30 30 29 30 0 354
170 2036 */{ 6, 1, 28, 53848 }
, /* 30 30 29 30 29 29 30 29 29 30 29 30 30 384
171 2037 */{ 0, 2, 15, 53840 }
, /* 30 30 29 30 29 29 30 29 29 30 29 30 0 354
172 2038 */{ 0, 2, 4, 54560 }
, /* 30 30 29 30 29 30 29 30 29 29 30 29 0 354
173 2039 */{ 5, 1, 24, 55968 }
, /* 30 30 29 30 30 29 30 29 30 29 30 29 29 384
174 2040 */{ 0, 2, 12, 46496 }
, /* 30 29 30 30 29 30 29 30 30 29 30 29 0 355
175 2041 */{ 0, 2, 1, 22224 }
, /* 29 30 29 30 29 30 30 29 30 30 29 30 0 355
176 2042 */{ 2, 1, 22, 19160 }
, /* 29 30 29 29 30 29 30 29 30 30 29 30 30 384
177 2043 */{ 0, 2, 10, 18864 }
, /* 29 30 29 29 30 29 29 30 30 29 30 30 0 354
178 2044 */{ 7, 1, 30, 42168 }
, /* 30 29 30 29 29 30 29 29 30 29 30 30 30 384
179 2045 */{ 0, 2, 17, 42160 }
, /* 30 29 30 29 29 30 29 29 30 29 30 30 0 354
180 2046 */{ 0, 2, 6, 43600 }
, /* 30 29 30 29 30 29 30 29 29 30 29 30 0 354
181 2047 */{ 5, 1, 26, 46376 }
, /* 30 29 30 30 29 30 29 30 29 29 30 29 30 384
182 2048 */{ 0, 2, 14, 27936 }
, /* 29 30 30 29 30 30 29 30 29 29 30 29 0 354
183 2049 */{ 0, 2, 2, 44448 }
, /* 30 29 30 29 30 30 29 30 30 29 30 29 0 355
184 2050 */{ 3, 1, 23, 21936 }
, /* 29 30 29 30 29 30 29 30 30 29 30 30 29 384
188 internal override int MinCalendarYear
=> MinLunisolarYear
;
190 internal override int MaxCalendarYear
=> MaxLunisolarYear
;
192 internal override DateTime MinDate
=> s_minDate
;
194 internal override DateTime MaxDate
=> s_maxDate
;
196 internal override EraInfo
[]? CalEraInfo
=> s_taiwanLunisolarEraInfo
;
198 internal override int GetYearInfo(int lunarYear
, int index
)
200 if ((lunarYear
< MinLunisolarYear
) || (lunarYear
> MaxLunisolarYear
))
202 throw new ArgumentOutOfRangeException(
205 SR
.Format(SR
.ArgumentOutOfRange_Range
, MinLunisolarYear
, MaxLunisolarYear
));
208 return s_yinfo
[lunarYear
- MinLunisolarYear
, index
];
211 internal override int GetYear(int year
, DateTime time
)
213 return _helper
.GetYear(year
, time
);
216 internal override int GetGregorianYear(int year
, int era
)
218 return _helper
.GetGregorianYear(year
, era
);
221 public TaiwanLunisolarCalendar()
223 _helper
= new GregorianCalendarHelper(this, s_taiwanLunisolarEraInfo
);
226 public override int GetEra(DateTime time
) => _helper
.GetEra(time
);
228 internal override CalendarId BaseCalendarID
=> CalendarId
.TAIWAN
;
230 internal override CalendarId ID
=> CalendarId
.TAIWANLUNISOLAR
;
232 public override int[] Eras
=> _helper
.Eras
;