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 julian = toJulian(aYear, aMonth, aDayOfMonth);
14 }
15
16 /**
17
18 @return
19 */
20 public int getYear()
21 {
22 return fromJulian(julian)[0];
23 }
24
25 /**
26
27 @return
28 */
29 public int getMonthValue()
30 {
31 return fromJulian(julian)[1];
32 }
33
34 /**
35
36 @return
37 */
38 public int getDayOfMonth()
39 {
40 return fromJulian(julian)[2];
41 }
42
43 /**
44
45
46 @param n
47 @return
48 */
49 public Day plusDays(int n)
50 {
51 return new Day(julian + n);
52 }
53
54 /**
55
56 @param other
57 @return
58
59 */
60 public int daysFrom(Day other)
61 {
62 return julian - other.julian;
63 }
64
65 private Day(int aJulian)
66 {
67 julian = aJulian;
68 }
69
70 /**
71
72 @param year
73 @param month
74 @param date
75 @return
76
77
78
79
80
81
82
83
84
85
86
87 */
88 private static int toJulian(int year, int month, int date)
89 {
90 int jy = year;
91 if (year < 0) jy++;
92 int jm = month;
93 if (month > 2) jm++;
94 else
95 {
96 jy--;
97 jm += 13;
98 }
99 int jul = (int) (java.lang.Math.floor(365.25 * jy)
100 + java.lang.Math.floor(30.6001 * jm) + date + 1720995.0);
101
102 int IGREG = 15 + 31 * (10 + 12 * 1582);
103 //
104
105 if (date + 31 * (month + 12 * year) >= IGREG)
106 //
107 {
108 int ja = (int) (0.01 * jy);
109 jul += 2 - ja + (int) (0.25 * ja);
110 }
111 return jul;
112 }
113
114 /**
115
116
117
118
119
120 @param j
121 @return
122
123 */
124 private static int[] fromJulian(int j)
125 {
126 int ja = j;
127
128 int JGREG = 2299161;
129 //
130
131 if (j >= JGREG)
132 //
133 {
134 int jalpha = (int) (((float) (j - 1867216) - 0.25)
135 / 36524.25);
136 ja += 1 + jalpha - (int) (0.25 * jalpha);
137 }
138 int jb = ja + 1524;
139 int jc = (int) (6680.0 + ((float) (jb - 2439870) - 122.1)
140 / 365.25);
141 int jd = (int) (365 * jc + (0.25 * jc));
142 int je = (int) ((jb - jd) / 30.6001);
143 int date = jb - jd - (int) (30.6001 * je);
144 int month = je - 1;
145 if (month > 12) month -= 12;
146 int year = jc - 4715;
147 if (month > 2) --year;
148 if (year <= 0) --year;
149 return new int[] { year, month, date };
150 }
151
152 private int julian;
153 }
154
155
156
157
158