View Javadoc
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 }