comparison tango/tango/time/chrono/Hijri.d @ 132:1700239cab2e trunk

[svn r136] MAJOR UNSTABLE UPDATE!!! Initial commit after moving to Tango instead of Phobos. Lots of bugfixes... This build is not suitable for most things.
author lindquist
date Fri, 11 Jan 2008 17:57:40 +0100
parents
children
comparison
equal deleted inserted replaced
131:5825d48b27d1 132:1700239cab2e
1 /*******************************************************************************
2
3 copyright: Copyright (c) 2005 John Chapman. All rights reserved
4
5 license: BSD style: $(LICENSE)
6
7 version: Mid 2005: Initial release
8 Apr 2007: reshaped
9
10 author: John Chapman, Kris
11
12 ******************************************************************************/
13
14 module tango.time.chrono.Hijri;
15
16 private import tango.time.chrono.Calendar;
17
18
19 /**
20 * $(ANCHOR _Hijri)
21 * Represents the Hijri calendar.
22 */
23 public class Hijri : Calendar {
24
25 private static const uint[] DAYS_TO_MONTH = [ 0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355 ];
26
27 /**
28 * Represents the current era.
29 */
30 public const uint HIJRI_ERA = 1;
31
32 /**
33 * Overridden. Returns a Time value set to the specified date and time in the specified _era.
34 * Params:
35 * year = An integer representing the _year.
36 * month = An integer representing the _month.
37 * day = An integer representing the _day.
38 * hour = An integer representing the _hour.
39 * minute = An integer representing the _minute.
40 * second = An integer representing the _second.
41 * millisecond = An integer representing the _millisecond.
42 * era = An integer representing the _era.
43 * Returns: A Time set to the specified date and time.
44 */
45 public override Time toTime(uint year, uint month, uint day, uint hour, uint minute, uint second, uint millisecond, uint era) {
46 return Time((daysSinceJan1(year, month, day) - 1) * TimeSpan.TicksPerDay + getTimeTicks(hour, minute, second)) + TimeSpan.millis(millisecond);
47 }
48
49 /**
50 * Overridden. Returns the day of the week in the specified Time.
51 * Params: time = A Time value.
52 * Returns: A DayOfWeek value representing the day of the week of time.
53 */
54 public override DayOfWeek getDayOfWeek(Time time) {
55 return cast(DayOfWeek) (cast(uint) (time.ticks / TimeSpan.TicksPerDay + 1) % 7);
56 }
57
58 /**
59 * Overridden. Returns the day of the month in the specified Time.
60 * Params: time = A Time value.
61 * Returns: An integer representing the day of the month of time.
62 */
63 public override uint getDayOfMonth(Time time) {
64 return extractPart(time.ticks, DatePart.Day);
65 }
66
67 /**
68 * Overridden. Returns the day of the year in the specified Time.
69 * Params: time = A Time value.
70 * Returns: An integer representing the day of the year of time.
71 */
72 public override uint getDayOfYear(Time time) {
73 return extractPart(time.ticks, DatePart.DayOfYear);
74 }
75
76 /**
77 * Overridden. Returns the day of the year in the specified Time.
78 * Params: time = A Time value.
79 * Returns: An integer representing the day of the year of time.
80 */
81 public override uint getMonth(Time time) {
82 return extractPart(time.ticks, DatePart.Month);
83 }
84
85 /**
86 * Overridden. Returns the year in the specified Time.
87 * Params: time = A Time value.
88 * Returns: An integer representing the year in time.
89 */
90 public override uint getYear(Time time) {
91 return extractPart(time.ticks, DatePart.Year);
92 }
93
94 /**
95 * Overridden. Returns the era in the specified Time.
96 * Params: time = A Time value.
97 * Returns: An integer representing the ear in time.
98 */
99 public override uint getEra(Time time) {
100 return HIJRI_ERA;
101 }
102
103 /**
104 * Overridden. Returns the number of days in the specified _year and _month of the specified _era.
105 * Params:
106 * year = An integer representing the _year.
107 * month = An integer representing the _month.
108 * era = An integer representing the _era.
109 * Returns: The number of days in the specified _year and _month of the specified _era.
110 */
111 public override uint getDaysInMonth(uint year, uint month, uint era) {
112 if (month == 12)
113 return isLeapYear(year, CURRENT_ERA) ? 30 : 29;
114 return (month % 2 == 1) ? 30 : 29;
115 }
116
117 /**
118 * Overridden. Returns the number of days in the specified _year of the specified _era.
119 * Params:
120 * year = An integer representing the _year.
121 * era = An integer representing the _era.
122 * Returns: The number of days in the specified _year in the specified _era.
123 */
124 public override uint getDaysInYear(uint year, uint era) {
125 return isLeapYear(year, era) ? 355 : 354;
126 }
127
128 /**
129 * Overridden. Returns the number of months in the specified _year of the specified _era.
130 * Params:
131 * year = An integer representing the _year.
132 * era = An integer representing the _era.
133 * Returns: The number of months in the specified _year in the specified _era.
134 */
135 public override uint getMonthsInYear(uint year, uint era) {
136 return 12;
137 }
138
139 /**
140 * Overridden. Indicates whether the specified _year in the specified _era is a leap _year.
141 * Params: year = An integer representing the _year.
142 * Params: era = An integer representing the _era.
143 * Returns: true is the specified _year is a leap _year; otherwise, false.
144 */
145 public override bool isLeapYear(uint year, uint era) {
146 return (14 + 11 * year) % 30 < 11;
147 }
148
149 /**
150 * $(I Property.) Overridden. Retrieves the list of eras in the current calendar.
151 * Returns: An integer array representing the eras in the current calendar.
152 */
153 public override uint[] eras() {
154 auto tmp = [HIJRI_ERA];
155 return tmp.dup;
156 }
157
158 /**
159 * $(I Property.) Overridden. Retrieves the identifier associated with the current calendar.
160 * Returns: An integer representing the identifier of the current calendar.
161 */
162 public override uint id() {
163 return HIJRI;
164 }
165
166 private long daysToYear(uint year) {
167 int cycle = ((year - 1) / 30) * 30;
168 int remaining = year - cycle - 1;
169 long days = ((cycle * 10631L) / 30L) + 227013L;
170 while (remaining > 0) {
171 days += 354 + (isLeapYear(remaining, CURRENT_ERA) ? 1 : 0);
172 remaining--;
173 }
174 return days;
175 }
176
177 private long daysSinceJan1(uint year, uint month, uint day) {
178 return cast(long)(daysToYear(year) + DAYS_TO_MONTH[month - 1] + day);
179 }
180
181 private int extractPart(long ticks, DatePart part) {
182 long days = TimeSpan(ticks).days + 1;
183 int year = cast(int)(((days - 227013) * 30) / 10631) + 1;
184 long daysUpToYear = daysToYear(year);
185 long daysInYear = getDaysInYear(year, CURRENT_ERA);
186 if (days < daysUpToYear) {
187 daysUpToYear -= daysInYear;
188 year--;
189 }
190 else if (days == daysUpToYear) {
191 year--;
192 daysUpToYear -= getDaysInYear(year, CURRENT_ERA);
193 }
194 else if (days > daysUpToYear + daysInYear) {
195 daysUpToYear += daysInYear;
196 year++;
197 }
198
199 if (part == DatePart.Year)
200 return year;
201
202 days -= daysUpToYear;
203 if (part == DatePart.DayOfYear)
204 return cast(int)days;
205
206 int month = 1;
207 while (month <= 12 && days > DAYS_TO_MONTH[month - 1])
208 month++;
209 month--;
210 if (part == DatePart.Month)
211 return month;
212
213 return cast(int)(days - DAYS_TO_MONTH[month - 1]);
214 }
215
216 }
217