1 package fr.ifremer.quadrige2.core.dao.technical;
2
3 /*-
4 * #%L
5 * Quadrige2 Core :: Quadrige2 Core Shared
6 * $Id:$
7 * $HeadURL:$
8 * %%
9 * Copyright (C) 2017 Ifremer
10 * %%
11 * This program is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU Affero General Public License as published by
13 * the Free Software Foundation, either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU Affero General Public License
22 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 * #L%
24 */
25
26
27
28 import com.google.common.base.Preconditions;
29 import org.apache.commons.lang3.StringUtils;
30 import org.nuiton.util.DateUtil;
31
32 import java.sql.Timestamp;
33 import java.text.ParseException;
34 import java.text.SimpleDateFormat;
35 import java.util.Calendar;
36 import java.util.Date;
37 import java.util.TimeZone;
38
39 /**
40 * <p>Dates class.</p>
41 */
42 public class Dates extends org.apache.commons.lang3.time.DateUtils{
43
44 /**
45 * Remove a amount of month to a date
46 *
47 * @param date a {@link java.util.Date} object.
48 * @param amount the amount to remove, in month
49 * @return a new date (= the given date - amount in month)
50 */
51 public static Date removeMonth(Date date, int amount) {
52 Preconditions.checkNotNull(date);
53 Preconditions.checkArgument(amount > 0);
54
55 // Compute the start date
56 Calendar calendar = Calendar.getInstance();
57 calendar.setTimeInMillis(date.getTime());
58 calendar.set(Calendar.HOUR_OF_DAY, 0);
59 calendar.set(Calendar.DAY_OF_MONTH, 1);
60 calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH)-amount);
61 return calendar.getTime();
62 }
63
64 /**
65 * Get the number of days between two dates
66 *
67 * @param startDate a {@link java.util.Date} object.
68 * @param endDate a {@link java.util.Date} object.
69 * @return a number of hours
70 */
71 public static double hoursBetween(Date startDate, Date endDate){
72 double millis = endDate.getTime() - startDate.getTime();
73 return millis / (1000 * 60 * 60);
74 }
75
76 /**
77 * Add to date some hours
78 *
79 * @param date a {@link java.util.Date} object.
80 * @param amount a {@link java.lang.Double} object.
81 * @return a date (= date + amount)
82 */
83 public static Date addHours(Date date, Double amount){
84 long millis = (long) (date.getTime() + amount.doubleValue() * (1000 * 60 * 60));
85 return new Date(millis);
86 }
87
88
89 /**
90 * Get the last second time of a day: 23:59:59 (0 millisecond)
91 *
92 * @param date a {@link java.util.Date} object.
93 * @return a {@link java.util.Date} object.
94 */
95 public static Date lastSecondOfTheDay(Date date) {
96 Calendar calendar = Calendar.getInstance();
97 calendar.setTime(date);
98 calendar.set(Calendar.HOUR_OF_DAY, 23);
99 calendar.set(Calendar.MINUTE, 59);
100 calendar.set(Calendar.SECOND, 59);
101 calendar.set(Calendar.MILLISECOND, 0);
102 return calendar.getTime();
103 }
104
105 /**
106 * reset to 00h00m00s (and 0 millisecond)
107 *
108 * @param date a {@link java.util.Date} object.
109 * @param timezone a {@link java.util.TimeZone} object.
110 * @return a {@link java.util.Date} object.
111 */
112 public static Date resetTime(Date date, TimeZone timezone) {
113 Calendar localCalendar = Calendar.getInstance();
114 localCalendar.setTime(date);
115
116 Calendar calendar = timezone != null ? Calendar.getInstance(timezone) : Calendar.getInstance();
117 calendar.set(Calendar.DAY_OF_MONTH, localCalendar.get(Calendar.DAY_OF_MONTH));
118 calendar.set(Calendar.MONTH, localCalendar.get(Calendar.MONTH));
119 calendar.set(Calendar.YEAR, localCalendar.get(Calendar.YEAR));
120 resetTime(calendar);
121
122 return calendar.getTime();
123 }
124
125 /**
126 * reset to 00h00m00s (and 0 millisecond)
127 *
128 * @param date a {@link java.util.Date} object.
129 * @return a {@link java.util.Date} object.
130 */
131 public static Date resetTime(Date date) {
132 return resetTime(date, null);
133 }
134
135 /**
136 * reset to 00h00m00s (and 0 millisecond)
137 *
138 * @param calendar a {@link java.util.Calendar} object.
139 * @return a {@link java.util.Calendar} object.
140 */
141 public static Calendar resetTime(Calendar calendar) {
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 * reset to 0 millisecond
152 *
153 * @param date a {@link java.sql.Timestamp} object.
154 * @return a {@link java.sql.Timestamp} object.
155 */
156 public static Timestamp resetMillisecond(Timestamp date) {
157 Calendar calendar = Calendar.getInstance();
158 calendar.setTime(date);
159 calendar.set(Calendar.MILLISECOND, 0);
160
161 return new Timestamp(calendar.getTimeInMillis());
162 }
163
164 /**
165 * reset to 0 millisecond
166 *
167 * @param calendar a {@link java.util.Calendar} object.
168 * @return a {@link java.util.Calendar} object.
169 */
170 public static Calendar resetMillisecond(Calendar calendar) {
171 calendar.set(Calendar.MILLISECOND, 0);
172
173 return calendar;
174 }
175
176 /**
177 * <p>getDifferenceInDays.</p>
178 *
179 * @param startDate a {@link java.util.Date} object.
180 * @param endDate a {@link java.util.Date} object.
181 * @return a int.
182 */
183 public static int getDifferenceInDays(Date startDate, Date endDate) {
184 return DateUtil.getDifferenceInDays(startDate, endDate);
185 }
186
187 /**
188 * <p>formatDate.</p>
189 *
190 * @param date a {@link java.util.Date} object.
191 * @param pattern a {@link java.lang.String} object.
192 * @return a {@link java.lang.String} object.
193 */
194 public static String formatDate(Date date, String pattern) {
195 if (date == null) return null;
196 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
197 return simpleDateFormat.format(date);
198 }
199
200 /**
201 * Convert to a date, or return null if parse error
202 *
203 * @param date a {@link java.lang.String} object.
204 * @param pattern a {@link java.lang.String} object.
205 * @return a {@link java.util.Date} object.
206 */
207 public static Date safeParseDate(String date, String pattern) {
208 Date result = null;
209 if (StringUtils.isNotBlank(date)) {
210 try {
211 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
212 result = simpleDateFormat.parse(date);
213 } catch (ParseException ignored) {
214 }
215 }
216 return result;
217 }
218
219 /**
220 * Convert to a date, or return null if parse error
221 *
222 * @param date a {@link String} object.
223 * @param patterns a {@link String} object.
224 * @return a {@link Date} object.
225 */
226 public static Date safeParseDate(String date, String... patterns) {
227 Date result = null;
228 if (StringUtils.isNotBlank(date)) {
229 for (String pattern: patterns) {
230 try {
231 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
232 result = simpleDateFormat.parse(date);
233 } catch (ParseException ignored) {
234 // Continue: try next pattern
235 }
236 }
237 }
238 return result;
239 }
240
241 /**
242 * Adds a number of seconds to a date returning a new object.
243 * The original {@code Timestamp} is unchanged.
244 *
245 * @param date the Timestamp, not null
246 * @param amount the amount to add, may be negative
247 * @return the new {@code Timestamp} with the amount added
248 * @throws IllegalArgumentException if the date is null
249 */
250 public static Timestamp addSeconds(Timestamp date, int amount) {
251 if(date == null) {
252 throw new IllegalArgumentException("The date must not be null");
253 } else {
254 Calendar c = Calendar.getInstance();
255 c.setTime(date);
256 c.add(Calendar.SECOND, amount);
257 return new Timestamp(c.getTimeInMillis());
258 }
259 }
260
261 }