File: DateRange.java

package info (click to toggle)
gpsprune 26.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,824 kB
  • sloc: java: 52,154; sh: 25; makefile: 21; python: 15
file content (242 lines) | stat: -rw-r--r-- 6,665 bytes parent folder | download | duplicates (4)
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
package tim.prune.function.filesleuth.data;

public class DateRange
{
	private final Date _dateFrom, _dateTo;

	public static final DateRange EMPTY_RANGE = new DateRange(null, null);
	public static final DateRange INVALID_RANGE = new DateRange(null, new Date(-1, -1, -1));


	/** Constructor */
	public DateRange(Date inFrom, Date inTo)
	{
		boolean inOrder = inFrom == null || inTo == null || inTo.isAfter(inFrom);
		_dateFrom = inOrder ? inFrom : inTo;
		_dateTo = inOrder ? inTo : inFrom;
	}

	/** @return a DateRange for a single day */
	public static DateRange parseValues(int inYear, int inMonth, int inDay) {
		return parseValues(inYear, inMonth, inDay, inYear, inMonth, inDay);
	}

	public static DateRange parseValues(int inYearFrom, int inMonthFrom, int inDayFrom,
		int inYearTo, int inMonthTo, int inDayTo)
	{
		if (inYearFrom < 1000 || inYearFrom > 9999 || inYearTo < 1000 || inYearTo > 9999) {
			return null;
		}
		// Whole year(s)
		if (inMonthFrom <= 0 && inDayFrom <= 0 && inMonthTo <= 0 && inDayTo <= 0) {
			return new DateRange(new Date(inYearFrom, 1, 1), new Date(inYearTo, 12, 31));
		}
		// Range of months
		if (inMonthFrom > 0 && inDayFrom <= 0 && inMonthTo > 0 && inDayTo <= 0)
		{
			int daysInMonth = Date.getDaysInMonth(inYearTo, inMonthTo);
			return new DateRange(new Date(inYearFrom, inMonthFrom, 1),
					new Date(inYearTo, inMonthTo, daysInMonth));
		}
		// Range of days
		if (inMonthFrom > 0 && inDayFrom > 0 && inMonthTo > 0 && inDayTo > 0)
		{
			return new DateRange(new Date(inYearFrom, inMonthFrom, inDayFrom),
					new Date(inYearTo, inMonthTo, inDayTo));
		}
		return null;
	}

	public static DateRange parseString(String inValue)
	{
		final String value = (inValue == null ? "" : inValue.trim());
		if (value.isEmpty()) {
			return EMPTY_RANGE;
		}
		if (value.length() < 4) {
			return INVALID_RANGE;
		}
		if (value.length() == 4)
		{
			// Single year
			try {
				final int year = Integer.parseInt(value);
				if (year >= 1000) {
					return new DateRange(new Date(year, 1, 1), new Date(year, 12, 31));
				}
			}
			catch (NumberFormatException e) {}
		}
		else if (value.length() == 7 && Date.isSeparator(value.charAt(4)))
		{
			// single month
			try {
				final int year = Integer.parseInt(value.substring(0, 4));
				final int month = Integer.parseInt(value.substring(5));
				if (year >= 1000 && month >= 1 && month <= 12)
				{
					return new DateRange(new Date(year, month, 1),
							new Date(year, month, Date.getDaysInMonth(year, month)));
				}
			}
			catch (NumberFormatException e) {}
		}
		else if (value.length() == 10 && Date.isSeparator(value.charAt(4)) && Date.isSeparator(value.charAt(7)))
		{
			// single date
			Date date = Date.parseString(value);
			if (date != null) {
				return new DateRange(date, date);
			}
		}
		else if (value.length() >= 21) {
			return parseDatePair(value);
		}
		return INVALID_RANGE;
	}

	public boolean isEmpty() {
		return _dateFrom == null;
	}

	public boolean isValid()
	{
		return this != INVALID_RANGE
			&& _dateFrom != null && _dateFrom.isValid()
			&& _dateTo != null && _dateTo.isValid();
	}

	public Date getDateFrom() {
		return _dateFrom;
	}

	public Date getDateTo() {
		return _dateTo;
	}

	public boolean isYearMonthDay() {
		return toShortString().length() <= 10;
	}

	private static DateRange parseDatePair(String value)
	{
		Date firstDate = Date.parseString(value.substring(0, 10));
		if (firstDate == null || !firstDate.isValid()) {
			return INVALID_RANGE;
		}
		int startOfSecondDate = value.length() - 10;
		for (int pos = 11; pos < startOfSecondDate; pos++)
		{
			if (!Date.isSeparator(value.charAt(pos))) {
				return INVALID_RANGE;
			}
		}
		Date secondDate = Date.parseString(value.substring(startOfSecondDate));
		if (secondDate == null || !secondDate.isValid()) {
			return INVALID_RANGE;
		}
		if (firstDate.isAfter(secondDate)) {
			return new DateRange(secondDate, firstDate); // reverse order
		}
		return new DateRange(firstDate, secondDate);
	}

	public String toString()
	{
		if (isEmpty()) {
			return "";
		}
		if (_dateFrom.equals(_dateTo)) {
			// single date
			return _dateFrom.toString();
		}
		else {
			// different start and end date
			return String.format("%s - %s", _dateFrom.toString(), _dateTo.toString());
		}
	}

	public String toShortString()
	{
		if (isEmpty()) {
			return "";
		}
		final int year = _dateFrom.getYear();
		if (_dateFrom.getYear() == _dateTo.getYear())
		{
			// is it a single year?
			if (_dateFrom.getMonth() == 1 && _dateTo.getMonth() == 12
				&& _dateFrom.getDay() == 1 && _dateTo.getDay() == 31)
			{
				return "" + year;
			}
			// is it a single month?
			final int month = _dateFrom.getMonth();
			if (month >= 1 && month == _dateTo.getMonth()
				&& _dateFrom.getDay() == 1 && _dateTo.getDay() == Date.getDaysInMonth(year, month))
			{
				return String.format("%d-%02d", year, month);
			}
			// single day?
			if (_dateFrom.equals(_dateTo)) {
				return _dateFrom.toString();
			}
		}
		return toString();
	}

	public boolean contains(Date date)
	{
		if (isEmpty()) {
			return true; // no filter or invalid filter
		}
		if (date == null) {
			return false; // filter but no date
		}
		if (_dateFrom.isAfter(date)) {
			return false; // date is before filter
		}
		return _dateTo == null || !date.isAfter(_dateTo);
	}

	public boolean overlaps(DateRange inTrackRange)
	{
		if (isEmpty()) {
			return true;	// no filter
		}
		if (inTrackRange == null || inTrackRange.isEmpty()) {
			return false;	// no dates in track
		}
		if (_dateFrom.isAfter(inTrackRange._dateTo) || inTrackRange._dateFrom.isAfter(_dateTo)) {
			return false;	// no overlap
		}
		return true;
	}

	/** Comparison with another DateRange */
	public boolean equals(DateRange inOtherRange)
	{
		if (isEmpty()) {
			return inOtherRange == null || inOtherRange.isEmpty();
		}
		return _dateFrom.equals(inOtherRange._dateFrom) && _dateTo.equals(inOtherRange._dateTo);
	}

	/** Comparison with an Object */
	public boolean equals(Object inOther)
	{
		DateRange range = (inOther instanceof DateRange ? (DateRange) inOther : null);
		return equals(range);
	}

	public boolean includes(DateRange inTrackRange)
	{
		if (isEmpty()) {
			return inTrackRange == null || inTrackRange.isEmpty();
		}
		if (inTrackRange == null || inTrackRange.isEmpty()) {
			return true;
		}
		return !_dateFrom.isAfter(inTrackRange._dateFrom) && !inTrackRange._dateTo.isAfter(_dateTo);
	}
}