1 public class Day
2 {
3 /**
4
5
6
7 @param aYear
8 @param aMonth
9 @param aDayOfMonth
10 */
11 public Day(int aYear, int aMonth, int aDayOfMonth)
12 {
13 year = aYear;
14 month = aMonth;
15 date = aDayOfMonth;
16 ymdValid = true;
17 julianValid = false;
18 }
19
20 /**
21
22 @return
23 */
24 public int getYear()
25 {
26 ensureYmd();
27 return year;
28 }
29
30 /**
31
32 @return
33 */
34 public int getMonthValue()
35 {
36 ensureYmd();
37 return month;
38 }
39
40 /**
41
42 @return
43 */
44 public int getDayOfMonth()
45 {
46 ensureYmd();
47 return date;
48 }
49
50 /**
51
52
53 @param n
54 @return
55 */
56 public Day plusDays(int n)
57 {
58 ensureJulian();
59 return new Day(julian + n);
60 }
61
62 /**
63
64
65 @param other
66 @return
67
68 */
69 public int daysFrom(Day other)
70 {
71 ensureJulian();
72 other.ensureJulian();
73 return julian - other.julian;
74 }
75
76 private Day(int aJulian)
77 {
78 julian = aJulian;
79 ymdValid = false;
80 julianValid = true;
81 }
82
83 /**
84
85
86 */
87 private void ensureJulian()
88 {
89 if (julianValid) return;
90 julian = toJulian(year, month, date);
91 julianValid = true;
92 }
93
94 /**
95
96 */
97 private void ensureYmd()
98 {
99 if (ymdValid) return;
100 int[] ymd = fromJulian(julian);
101 year = ymd[0];
102 month = ymd[1];
103 date = ymd[2];
104 ymdValid = true;
105 }
106
107 /**
108
109
110 @param year
111 @param month
112 @param date
113 @return
114
115
116
117
118
119
120
121
122
123
124
125 */
126 private static int toJulian(int year, int month, int date)
127 {
128 int jy = year;
129 if (year < 0) jy++;
130 int jm = month;
131 if (month > 2) jm++;
132 else
133 {
134 jy--;
135 jm += 13;
136 }
137 int jul = (int) (java.lang.Math.floor(365.25 * jy)
138 + java.lang.Math.floor(30.6001 * jm) + date + 1720995.0);
139
140 int IGREG = 15 + 31 * (10 + 12 * 1582);
141 //
142
143 if (date + 31 * (month + 12 * year) >= IGREG)
144 //
145 {
146 int ja = (int) (0.01 * jy);
147 jul += 2 - ja + (int) (0.25 * ja);
148 }
149 return jul;
150 }
151
152 /**
153
154
155
156
157
158 @param j
159 @return
160
161 */
162 private static int[] fromJulian(int j)
163 {
164 int ja = j;
165
166 int JGREG = 2299161;
167 //
168
169 if (j >= JGREG)
170 //
171 {
172 int jalpha = (int) (((float) (j - 1867216) - 0.25)
173 / 36524.25);
174 ja += 1 + jalpha - (int) (0.25 * jalpha);
175 }
176 int jb = ja + 1524;
177 int jc = (int) (6680.0 + ((float) (jb - 2439870) - 122.1)
178 / 365.25);
179 int jd = (int) (365 * jc + (0.25 * jc));
180 int je = (int) ((jb - jd) / 30.6001);
181 int date = jb - jd - (int) (30.6001 * je);
182 int month = je - 1;
183 if (month > 12) month -= 12;
184 int year = jc - 4715;
185 if (month > 2) --year;
186 if (year <= 0) --year;
187 return new int[] { year, month, date };
188 }
189
190 private int year;
191 private int month;
192 private int date;
193 private int julian;
194 private boolean ymdValid;
195 private boolean julianValid;
196 }
197
198
199
200
201