1 package net.sumaris.core.util;
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 import com.google.common.base.Preconditions;
28 import org.apache.commons.lang3.StringUtils;
29 import org.nuiton.util.DateUtil;
30
31 import java.sql.Timestamp;
32 import java.text.ParseException;
33 import java.text.SimpleDateFormat;
34 import java.util.Calendar;
35 import java.util.Date;
36 import java.util.TimeZone;
37
38
39
40
41 public class Dates extends org.apache.commons.lang3.time.DateUtils{
42
43
44
45
46
47
48
49
50 public static Date removeMonth(Date date, int amount) {
51 Preconditions.checkNotNull(date);
52 Preconditions.checkArgument(amount > 0);
53
54
55 Calendar calendar = Calendar.getInstance();
56 calendar.setTimeInMillis(date.getTime());
57 calendar.set(Calendar.HOUR_OF_DAY, 0);
58 calendar.set(Calendar.DAY_OF_MONTH, 1);
59 calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH)-amount);
60 return calendar.getTime();
61 }
62
63
64
65
66
67
68
69
70 public static double hoursBetween(Date startDate, Date endDate){
71 double millis = endDate.getTime() - startDate.getTime();
72 return millis / (1000 * 60 * 60);
73 }
74
75
76
77
78
79
80
81
82 public static Date addHours(Date date, Double amount){
83 long millis = (long) (date.getTime() + amount * (1000 * 60 * 60));
84 return new Date(millis);
85 }
86
87
88
89
90
91
92
93
94 public static Date lastSecondOfTheDay(Date date) {
95 Calendar calendar = Calendar.getInstance();
96 calendar.setTime(date);
97 calendar.set(Calendar.HOUR_OF_DAY, 23);
98 calendar.set(Calendar.MINUTE, 59);
99 calendar.set(Calendar.SECOND, 59);
100 calendar.set(Calendar.MILLISECOND, 0);
101 return calendar.getTime();
102 }
103
104
105
106
107
108
109
110
111 public static Date resetTime(Date date, TimeZone timezone) {
112 Calendar localCalendar = Calendar.getInstance();
113 localCalendar.setTime(date);
114
115 Calendar calendar = timezone != null ? Calendar.getInstance(timezone) : Calendar.getInstance();
116 calendar.set(Calendar.DAY_OF_MONTH, localCalendar.get(Calendar.DAY_OF_MONTH));
117 calendar.set(Calendar.MONTH, localCalendar.get(Calendar.MONTH));
118 calendar.set(Calendar.YEAR, localCalendar.get(Calendar.YEAR));
119 resetTime(calendar);
120
121 return calendar.getTime();
122 }
123
124
125
126
127
128
129
130 public static Date resetTime(Date date) {
131 return resetTime(date, null);
132 }
133
134
135
136
137
138
139
140 public static Calendar resetTime(Calendar calendar) {
141 if (calendar == null) return null;
142 calendar.set(Calendar.HOUR_OF_DAY, 0);
143 calendar.set(Calendar.MINUTE, 0);
144 calendar.set(Calendar.SECOND, 0);
145 calendar.set(Calendar.MILLISECOND, 0);
146
147 return calendar;
148 }
149
150
151
152
153
154
155
156 public static Timestamp resetMillisecond(Timestamp date) {
157 if (date == null) return null;
158 Calendar calendar = Calendar.getInstance();
159 calendar.setTime(date);
160 calendar.set(Calendar.MILLISECOND, 0);
161
162 return new Timestamp(calendar.getTimeInMillis());
163 }
164
165
166
167
168
169
170
171 public static Timestamp resetMillisecond(Date date) {
172 if (date == null) return null;
173 Calendar calendar = Calendar.getInstance();
174 calendar.setTime(date);
175 calendar.set(Calendar.MILLISECOND, 0);
176
177 return new Timestamp(calendar.getTime().getTime());
178 }
179
180
181
182
183
184
185
186 public static Calendar resetMillisecond(Calendar calendar) {
187 calendar.set(Calendar.MILLISECOND, 0);
188
189 return calendar;
190 }
191
192
193
194
195
196
197
198
199 public static int getDifferenceInDays(Date startDate, Date endDate) {
200 return DateUtil.getDifferenceInDays(startDate, endDate);
201 }
202
203
204
205
206
207
208
209
210 public static String formatDate(Date date, String pattern) {
211 if (date == null) return null;
212 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
213 return simpleDateFormat.format(date);
214 }
215
216
217
218
219
220
221
222
223 public static Date safeParseDate(String date, String pattern) {
224 Date result = null;
225 if (StringUtils.isNotBlank(date)) {
226 try {
227 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
228 result = simpleDateFormat.parse(date);
229 } catch (ParseException ignored) {
230 }
231 }
232 return result;
233 }
234
235
236
237
238
239
240
241
242 public static Date safeParseDate(String date, String... patterns) {
243 Date result = null;
244 if (StringUtils.isNotBlank(date)) {
245 for (String pattern: patterns) {
246 try {
247 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
248 result = simpleDateFormat.parse(date);
249 } catch (ParseException ignored) {
250
251 }
252 }
253 }
254 return result;
255 }
256
257
258
259
260
261
262
263
264
265
266 public static Timestamp addSeconds(Timestamp date, int amount) {
267 if(date == null) {
268 throw new IllegalArgumentException("The date must not be null");
269 } else {
270 Calendar c = Calendar.getInstance();
271 c.setTime(date);
272 c.add(Calendar.SECOND, amount);
273 return new Timestamp(c.getTimeInMillis());
274 }
275 }
276
277
278
279
280
281
282 protected Date newCreateDate() {
283 return dateWithNoTime(new Date());
284 }
285
286
287
288
289
290
291 protected Timestamp newUpdateTimestamp() {
292 return new Timestamp((new Date()).getTime());
293 }
294
295
296
297
298
299
300
301 protected Date dateWithNoTime(Date date) {
302 Calendar calendar = Calendar.getInstance();
303 calendar.setTime(date);
304 calendar.set(Calendar.HOUR_OF_DAY, 0);
305 calendar.set(Calendar.MINUTE, 0);
306 calendar.set(Calendar.SECOND, 0);
307 calendar.set(Calendar.MILLISECOND, 0);
308 return calendar.getTime();
309 }
310
311
312
313
314
315
316
317 protected Date dateWithNoMillisecond(Date date) {
318 Calendar calendar = Calendar.getInstance();
319 calendar.setTime(date);
320 calendar.set(Calendar.MILLISECOND, 0);
321 return calendar.getTime();
322 }
323
324
325
326
327
328
329
330 protected Date dateWithNoSecondAndMillisecond(Date date) {
331 Calendar calendar = Calendar.getInstance();
332 calendar.setTime(date);
333 calendar.set(Calendar.SECOND, 0);
334 calendar.set(Calendar.MILLISECOND, 0);
335 return calendar.getTime();
336 }
337
338
339
340
341
342
343
344 protected Date dateWithNoSecondAndOneMillisecond(Date date) {
345 Calendar calendar = Calendar.getInstance();
346 calendar.setTime(date);
347 calendar.add(Calendar.SECOND, 0);
348 calendar.add(Calendar.MILLISECOND, 1);
349 return calendar.getTime();
350 }
351
352
353
354
355
356
357
358 protected Date dateWithOneMillisecond(Date date) {
359 Calendar calendar = Calendar.getInstance();
360 calendar.setTime(date);
361 calendar.add(Calendar.MILLISECOND, 1);
362 return calendar.getTime();
363 }
364
365
366
367
368
369
370
371 protected Date dateOfYearWithOneMillisecond(int year) {
372 Calendar calendar = Calendar.getInstance();
373 calendar.setTimeInMillis(0);
374 calendar.set(Calendar.YEAR, year);
375 calendar.set(Calendar.MILLISECOND, 1);
376 return calendar.getTime();
377 }
378
379
380
381
382
383
384
385 protected long dateOfYearWithOneMillisecondInMillisecond(int year) {
386 Calendar calendar = Calendar.getInstance();
387 calendar.setTimeInMillis(0);
388 calendar.set(Calendar.YEAR, year);
389 calendar.set(Calendar.MILLISECOND, 1);
390 return calendar.getTimeInMillis();
391 }
392
393
394
395
396
397
398
399 protected Date convertDatabase2UI(Timestamp databaseValue) {
400 Date result;
401 if (databaseValue == null) {
402 result = null;
403 } else {
404 Calendar calendar = Calendar.getInstance();
405 calendar.setTimeInMillis(databaseValue.getTime());
406 if (calendar.get(Calendar.MILLISECOND) != 0) {
407 result = null;
408 } else {
409 result = calendar.getTime();
410 }
411 }
412 return result;
413 }
414
415
416
417
418
419
420
421
422
423
424 protected Date convertUI2DatabaseMandatoryDate(Date uiValue,
425 Date defaultNotEmptyDate,
426 boolean addOneSecondToDefaultDate) {
427 Date result;
428
429
430 if (uiValue == null) {
431
432 Preconditions.checkState(
433 defaultNotEmptyDate != null,
434 "'defaultNotEmptyDate' could not be null.");
435 Calendar calendar = Calendar.getInstance();
436 calendar.setTime(defaultNotEmptyDate);
437 if (addOneSecondToDefaultDate) {
438 calendar.add(Calendar.SECOND, 1);
439 }
440 calendar.set(Calendar.MILLISECOND, 1);
441 result = calendar.getTime();
442 } else {
443
444 result = dateWithNoMillisecond(uiValue);
445 }
446
447 return result;
448 }
449
450 public static Date getFirstDayOfYear(int year) {
451 Calendar calendar = Calendar.getInstance();
452 calendar.set(Calendar.YEAR, year);
453 calendar.set(Calendar.DAY_OF_YEAR, 1);
454 resetTime(calendar);
455 return calendar.getTime();
456 }
457 public static Date getLastSecondOfYear(int year) {
458 Calendar calendar = Calendar.getInstance();
459 calendar.set(Calendar.YEAR, year+1);
460 calendar.set(Calendar.DAY_OF_YEAR, 1);
461 resetTime(calendar);
462 calendar.add(Calendar.SECOND, -1);
463 return calendar.getTime();
464 }
465
466 public static String elapsedTime(long timeInMs) {
467 long elapsedTime = System.currentTimeMillis() - timeInMs;
468 double seconds = (double) elapsedTime / 1_000;
469 return "in " + seconds + "s";
470 }
471
472
473 }