001 /* 002 * Created on Jan 22, 2011 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 005 * the License. You may obtain a copy of the License at 006 * 007 * http://www.apache.org/licenses/LICENSE-2.0 008 * 009 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 010 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 011 * specific language governing permissions and limitations under the License. 012 * 013 * Copyright @2011 the original author or authors. 014 */ 015 package org.fest.util; 016 017 import java.text.DateFormat; 018 import java.text.ParseException; 019 import java.text.SimpleDateFormat; 020 import java.util.Calendar; 021 import java.util.Date; 022 023 /** 024 * Utility methods related to dates. 025 * 026 * @author Joel Costigliola 027 */ 028 public class Dates { 029 030 /** 031 * ISO 8601 date format (yyyy-MM-dd), example : <code>2003-04-23</code> 032 */ 033 public static final DateFormat ISO_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); 034 035 /** 036 * ISO 8601 date-time format (yyyy-MM-dd'T'HH:mm:ss), example : <code>2003-04-26T13:01:02</code> 037 */ 038 public static final DateFormat ISO_DATE_TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 039 040 /** 041 * ISO 8601 date-time format with millisecond (yyyy-MM-dd'T'HH:mm:ss.SSS), example : <code>2003-04-26T03:01:02.999</code> 042 */ 043 public static final DateFormat ISO_DATE_TIME_FORMAT_WITH_MS = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); 044 045 /** 046 * Formats the given date using the ISO 8601 date-time format (yyyy-MM-dd'T'HH:mm:ss).<br> 047 * Method in synchronized because SimpleDateFormat is not thread safe (sigh). 048 * <p> 049 * Returns null if given the date is null. 050 * @param date the date to format. 051 * @return the formatted date or null if given the date was null. 052 */ 053 public static synchronized String formatAsDatetime(Date date) { 054 return date == null ? null : ISO_DATE_TIME_FORMAT.format(date); 055 } 056 057 /** 058 * Formats the given date using the ISO 8601 date-time format with millisecond (yyyy-MM-dd'T'HH:mm:ss:SSS).<br> 059 * Method in synchronized because SimpleDateFormat is not thread safe (sigh). 060 * <p> 061 * Returns null if given the date is null. 062 * @param date the date to format. 063 * @return the formatted date or null if given the date was null. 064 */ 065 public static synchronized String formatAsDatetimeWithMs(Date date) { 066 return date == null ? null : ISO_DATE_TIME_FORMAT_WITH_MS.format(date); 067 } 068 069 /** 070 * Formats the date of the given calendar using the ISO 8601 date-time format (yyyy-MM-dd'T'HH:mm:ss).<br> 071 * Method is thread safe. 072 * <p> 073 * Returns null if the given calendar is null. 074 * @param calendar the calendar to format. 075 * @return the formatted calendar or null if the given calendar was null. 076 */ 077 public static String formatAsDatetime(Calendar calendar) { 078 return calendar == null ? null : formatAsDatetime(calendar.getTime()); 079 } 080 081 /** 082 * Utility method to parse a Date following {@link #ISO_DATE_FORMAT}, returns null if the given String is null. 083 * @param dateAsString the string to parse as a Date following {@link #ISO_DATE_FORMAT} 084 * @return the corrresponding Date or null if the given String is null. 085 * @throws RuntimeException encapsulating ParseException if the string can't be parsed as a Date 086 */ 087 public static Date parse(String dateAsString) { 088 try { 089 return dateAsString == null ? null : ISO_DATE_FORMAT.parse(dateAsString); 090 } catch (ParseException e) { 091 throw new RuntimeException(e); 092 } 093 } 094 095 /** 096 * Utility method to parse a Date following {@link #ISO_DATE_TIME_FORMAT}, returns null if the given String is null. 097 * @param dateAsString the string to parse as a Date following {@link #ISO_DATE_TIME_FORMAT} 098 * @return the corrresponding Date with time details or null if the given String is null. 099 * @throws RuntimeException encapsulating ParseException if the string can't be parsed as a Date 100 */ 101 public static Date parseDatetime(String dateAsString) { 102 try { 103 return dateAsString == null ? null : ISO_DATE_TIME_FORMAT.parse(dateAsString); 104 } catch (ParseException e) { 105 throw new RuntimeException(e); 106 } 107 } 108 109 /** 110 * Converts the given Date to Calendar, returns null if the given Date is null. 111 * @param date the date to convert to a Calendar. 112 * @return the Calendar corresponding to the given Date or null if the given Date is null. 113 */ 114 public static Calendar toCalendar(Date date) { 115 if (date == null) { return null; } 116 Calendar calendar = Calendar.getInstance(); 117 calendar.setTime(date); 118 return calendar; 119 } 120 121 /** 122 * Extracts the year of the given Date. 123 * @param date the date to extract the year from - must not be null. 124 * @return the year of the given Date 125 * @throws NullPointerException if given Date is null 126 */ 127 public static int yearOf(Date date) { 128 return toCalendar(date).get(Calendar.YEAR); 129 } 130 131 /** 132 * Dates Extracts the month of the given Date <b>starting at 1</b> (January=1, February=2, ...). 133 * @param date the date to extract the month from - must not be null. 134 * @return the month of the given Date <b>starting at 1</b> (January=1, February=2, ...) 135 * @throws NullPointerException if given Date is null 136 */ 137 public static int monthOf(Date date) { 138 return toCalendar(date).get(Calendar.MONTH) + 1; // based 1 month (January=1) 139 } 140 141 /** 142 * Dates Extracts the day of month of the given Date. 143 * @param date the date to extract the day of month from - must not be null. 144 * @return the day of month of the given Date 145 * @throws NullPointerException if given Date is null 146 */ 147 public static int dayOfMonthOf(Date date) { 148 return toCalendar(date).get(Calendar.DAY_OF_MONTH); 149 } 150 151 /** 152 * Extracts the day of week of the given Date, returned value follows {@link Calendar#DAY_OF_WEEK} . 153 * @param date the date to extract the day of week from - must not be null. 154 * @return the day of week of the given Date 155 * @throws NullPointerException if given Date is null 156 */ 157 public static int dayOfWeekOf(Date date) { 158 return toCalendar(date).get(Calendar.DAY_OF_WEEK); 159 } 160 161 /** 162 * Extracts the hour of day if the given Date (24-hour clock). 163 * @param date the date to extract the hour of day from - must not be null. 164 * @return the hour of day of the given Date (24-hour clock) 165 * @throws NullPointerException if given Date is null 166 */ 167 public static int hourOfDay(Date date) { 168 return toCalendar(date).get(Calendar.HOUR_OF_DAY); 169 } 170 171 /** 172 * Dates Extracts the minute of the given Date. 173 * @param date the date to extract the minute from - must not be null. 174 * @return the minute of the given Date 175 * @throws NullPointerException if given Date is null 176 */ 177 public static int minuteOf(Date date) { 178 return toCalendar(date).get(Calendar.MINUTE); 179 } 180 181 /** 182 * Extracts the second of the given Date. 183 * @param date the date to extract the second from - must not be null. 184 * @return the second of the given Date 185 * @throws NullPointerException if given Date is null 186 */ 187 public static int secondOf(Date date) { 188 return toCalendar(date).get(Calendar.SECOND); 189 } 190 191 /** 192 * Extracts the millisecond of the given Date. 193 * @param date the date to extract the millisecond from - must not be null. 194 * @return the millisecond of the given Date 195 * @throws NullPointerException if given Date is null 196 */ 197 public static int millisecondOf(Date date) { 198 return toCalendar(date).get(Calendar.MILLISECOND); 199 } 200 201 /** 202 * Returns a copy of the given date without the time part (which is set to 00:00:00), for example :<br> 203 * <code>truncateTime(2008-12-29T23:45:12)</code> will give <code>2008-12-29T00:00:00</code>. 204 * <p> 205 * Returns null if the given Date is null. 206 * @param date we want to get the day part (the parameter is read only). 207 * @return the truncated date. 208 */ 209 public static Date truncateTime(Date date) { 210 if (date == null) { return null; } 211 Calendar cal = toCalendar(date); 212 cal.set(Calendar.HOUR_OF_DAY, 0); 213 cal.set(Calendar.MINUTE, 0); 214 cal.set(Calendar.SECOND, 0); 215 cal.set(Calendar.MILLISECOND, 0); 216 return cal.getTime(); 217 } 218 219 public static Date today() { 220 return new Date(); 221 } 222 223 public static Date yesterday() { 224 Calendar cal = Calendar.getInstance(); 225 cal.add(Calendar.DAY_OF_MONTH, -1); 226 return cal.getTime(); 227 } 228 229 public static Date tomorrow() { 230 Calendar cal = Calendar.getInstance(); 231 cal.add(Calendar.DAY_OF_MONTH, 1); 232 return cal.getTime(); 233 } 234 }