Utilities to working with dates java.util.Date
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
/**
* Utilities to working with dates (<tt>java.util.Date</tt>). <p>
*
* @author Javier Paniza
* @author Peter Smith
*/
public class Dates {
/**
* With hour to 0.
* If day, month and year are 0 return null.
*/
public static Date create(int day, int month, int year) {
return create(day, month, year, 0, 0, 0);
}
/**
* If day, month and year are 0 return null.
*/
public static Date create(int day, int month, int year, int hourofday, int minute, int second) {
if (day == 0 && month == 0 && year == 0) return null;
Calendar cal = Calendar.getInstance();
cal.set(year, month - 1, day, hourofday, minute, second);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
/**
* Current date without time.
*/
public static Date createCurrent() {
return removeTime(new java.util.Date());
}
/**
* Returns the day of date. <p>
*
* If date is null return 0.
*/
public static int getDay(Date date) {
if (date == null) return 0;
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.DAY_OF_MONTH);
}
/**
* Returns the year (4 digits) of date. <o>
*
* If date is null returns 0.
*/
public static int getYear(Date date) {
if (date == null) return 0;
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.YEAR);
}
/**
* Returns the month (1 to 12) of date. <p>
*
* If date is null returns 0.
*/
public static int getMonth(Date date) {
if (date == null) return 0;
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.MONTH) + 1;
}
/**
* Put the day to the date. <p>
*
* If date is null it has no effect (but no exception is thrown)
*/
public static void setDay(Date date, int day) {
if (date == null) return;
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.DAY_OF_MONTH, day);
}
/**
* Put the month (1 to 12) to the date. <p>
*
* If date is null it has no effect (but no exception is thrown)
*/
public static void setMonth(Date date, int month) {
if (date == null) return;
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.MONTH, month - 1);
}
/**
* Put the year to the date. <p>
*
* If date is null it has no effect (but no exception is thrown)
*/
public static void setYear(Date date, int year) {
if (date == null) return;
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.YEAR, year);
}
/**
* Puts hours, minutes, seconds and milliseconds to zero. <p>
*
* @return The same date sent as argument (a new date is not created). If null
* if sent a null is returned.
*/
public static Date removeTime(Date date) {
if (date == null) return null;
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
date.setTime(cal.getTime().getTime());
return date;
}
/**
* Returns a clone but without hours, minutes, seconds and milliseconds. <p>
*
* @return If null if sent a null is returned.
*/
public static Date cloneWithoutTime(Date date) {
if (date == null) return null;
Date result = (Date) date.clone();
removeTime(result);
return result;
}
/**
* Returns a clone but with 23:59:59:999 for hours, minutes, seconds and milliseconds. <p>
*
* @return The same date sent as argument (a new date is not created). If null
* if sent a null is returned.
*/
public static Date cloneWith2359(Date date) {
if (date == null) return null;
Date result = (Date) date.clone();
Calendar cal = Calendar.getInstance();
cal.setTime(result);
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
cal.set(Calendar.MILLISECOND, 999);
result.setTime(cal.getTime().getTime());
return result;
}
/**
* Creates a java.sql.Date from a java.util.Date. <p>
*
* @param date If null returns null
*/
public static java.sql.Date toSQL(java.util.Date date) {
if (date == null) return null;
return new java.sql.Date(date.getTime());
}
/**
* Creates a date with day, month and year of original,
* but with current time. <p>
*
* @param date It is not changed
* @return If arguments is null then is null
*/
public static java.util.Date withTime(java.util.Date date) {
if (date == null) return null;
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
cal.setTime(new java.util.Date());
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month);
cal.set(Calendar.DAY_OF_MONTH, day);
return cal.getTime();
}
/**
* Compares if 2 dates are equals at day, month and year
* level, ignoring time in comparing.
*
* @param f1 Can be null
* @param f2 Can be null
*/
public static boolean isDifferentDay(java.util.Date f1, java.util.Date f2) {
if (f1 == null && f2 == null) return false;
if (f1 == null || f2 == null) return true;
Calendar cal = Calendar.getInstance();
cal.setTime(f1);
int dd1 = cal.get(Calendar.DAY_OF_MONTH);
int mm1 = cal.get(Calendar.MONTH);
int aa1 = cal.get(Calendar.YEAR);
cal.setTime(f2);
int dd2 = cal.get(Calendar.DAY_OF_MONTH);
int mm2 = cal.get(Calendar.MONTH);
int aa2 = cal.get(Calendar.YEAR);
return !(aa1==aa2 && mm1==mm2 && dd1==dd2);
}
/**
* Difference of 2 dates in years, months and days. <p>
*
* @param f1 If null returns null
* @param f2 If null returns null
*/
public static DateDistance dateDistance(java.util.Date f1, java.util.Date f2, boolean includeStartDate ) {
DateDistance df = new DateDistance();
if (null == f1 || null == f2)
return null;
Calendar fmax = Calendar.getInstance(), fmin = Calendar.getInstance();
f1 = Dates.removeTime(f1);
f2 = Dates.removeTime(f2);
if (f1.after(f2)) {
fmax.setTime(f1);
fmin.setTime(f2);
}
else {
fmin.setTime(f1);
fmax.setTime(f2);
}
int initDay = fmin.get(Calendar.DATE);
int initMonth = fmin.get(Calendar.MONTH);
int initYear = fmin.get(Calendar.YEAR);
int endMonth = fmax.get(Calendar.MONTH);
int endYear = fmax.get(Calendar.YEAR);
int finalLimit = fmax.getActualMaximum(Calendar.DATE);
int initPeak = 0;
int finalPeak = 0;
if (initMonth == endMonth && initYear == endYear) {
while ( fmin.getTime().before(fmax.getTime()) ) {
fmin.add(Calendar.DATE, 1);
df.days++;
}
if (includeStartDate) {
df.days++;
}
if (df.days >= finalLimit) {
df.months++;
df.days = 0;
}
return df;
}
if (initDay != 1) {
while (fmin.get(Calendar.DATE) != 1) {
fmin.add(Calendar.DATE, 1);
initPeak++;
}
}
while (fmin.get(Calendar.MONTH) != endMonth
|| fmin.get(Calendar.YEAR) != endYear) {
fmin.add(Calendar.MONTH, 1);
df.months++;
if (df.months == 12) {
df.years++;
df.months = 0;
}
}
while ( fmin.getTime().before(fmax.getTime()) ) {
fmin.add(Calendar.DATE, 1);
finalPeak++;
}
int peak = initPeak + finalPeak;
if (includeStartDate) {
peak++;
}
if (peak >= finalLimit) {
peak = peak - finalLimit;
df.months++;
if (df.months == 12) {
df.years++;
df.months = 0;
}
}
df.days = peak;
return df;
}
/**
* Difference of 2 dates in years, months and days. <p>
*
* @param f1 If null returns null
* @param f2 If null returns null
*/
public static DateDistance dateDistance(java.util.Date f1, java.util.Date f2) {
return dateDistance(f1, f2, false);
}
public static DateDistance addDateDistances(DateDistance dis1, DateDistance dis2) {
DateDistance df=new DateDistance();
if ( null == dis1 || null == dis2 ) return null;
int years, months, days;
days = dis1.days + dis2.days;
months = days / 30;
days = days % 30;
months = months + dis1.months + dis2.months ;
years = months / 12 ;
months = months % 12;
years = years + ( dis1.years + dis2.years );
df.years = years;
df.months=months;
df.days=days;
return df;
}
public static DateDistance subtractDateDistances(DateDistance dis1, DateDistance dis2) {
DateDistance df = new DateDistance();
if ( null == dis1 || null == dis2 ) return null;
int years=0;
int months=0;
int days=0;
days = dis1.days - dis2.days;
months = dis1.months - dis2.months;
years =dis1.years - dis2.years;
if (days<0) {
days=days+30;
months=months-1;
}
if (months<0){
months=months+12;
years=years-1;
}
df.years = years;
df.months = months;
df.days = days;
return df;
}
public static String dateFormatForJSCalendar(Locale locale) {
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
String date = df.format(create(1, 2, 1971)); // d, m, y
boolean always4InYear= "es".equals(locale.getLanguage()) || "pl".equals(locale.getLanguage());
String result = date.
replaceAll("01", "%d").
replaceAll("02", "%m").
replaceAll("1971", "%Y").
replaceAll("71", always4InYear?"%Y":"%y").
replaceAll("1", "%d").
replaceAll("2", "%m");
return result;
}
public static String dateTimeFormatForJSCalendar(Locale locale) {
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale);
String datetime = df.format(create(1, 2, 1971, 15, 59, 0)); // d, m, y, hr, min, sec
boolean always4InYear= "es".equals(locale.getLanguage()) || "pl".equals(locale.getLanguage());
String result = datetime.
// time part
replaceAll("15", "%H"). // 24hr format
replaceAll("03", "%I"). // 12hr format - double digit
replaceAll("3", "%l"). // 12hr format - single digit
replaceAll("59","%M"). // minute
replaceAll("PM", "%p"). // AM/PM - uppercase
replaceAll("pm", "%P"). // am/pm - lowercase
// date part
replaceAll("01", "%d"). // day - double digit
replaceAll("02", "%m"). // month - double digit
replaceAll("1971", "%Y"). // year - 4 digit
replaceAll("71", always4InYear?"%Y":"%y"). // year - 2 digit
replaceAll("1", "%e"). // day - single digit
replaceAll("2", "%m") // month - ??? seems only double digit is supported by calendar
;
return result;
}
/**
* Returns number of days between startDate and endDate<p>
*
* @param java.util.Date startDate
* @param java.util.Date endDate
* @param boolean includeStartDate<p>
*
*/
public static int daysInterval (Date startDate, Date endDate,
boolean includeStartDate ) {
startDate = Dates.removeTime(startDate);
Calendar start = Calendar.getInstance();
start.setTime(startDate);
endDate = Dates.removeTime(endDate);
Calendar end = Calendar.getInstance();
end.setTime(endDate);
if (includeStartDate) {
start.add(Calendar.DATE, -1);
}
int days = 0;
while (start.before(end)) {
days++;
start.add(Calendar.DATE,1);
}
return days;
}
public static class DateDistance {
public int days;
public int months;
public int years;
}
}
Related examples in the same category
1. | Get the days difference | | |
2. | Get the days passed from the specified date up to the date provided in the constructor | | |
3. | Get the hours difference | | |
4. | Get the minutes difference | | |
5. | Get the seconds difference | | |
6. | Adds a number of days to a date returning a new object. | | |
7. | Adds a number of hours to a date returning a new object. | | |
8. | Adds a number of milliseconds to a date returning a new object. | | |
9. | Adds a number of minutes to a date returning a new object. | | |
10. | Adds a number of months to a date returning a new object. | | |
11. | Adds a number of seconds to a date returning a new object. | | |
12. | Adds a number of weeks to a date returning a new object. | | |
13. | Adds a number of years to a date returning a new object. | | |
14. | Returns a Date set just to Noon, to the closest possible millisecond of the day. | | |
15. | Returns a Date set to the first possible millisecond of the day, just after midnight. | | |
16. | Returns a Date set to the first possible millisecond of the month, just after midnight. | | |
17. | Returns a Date set to the last possible millisecond of the day, just before midnight. | | |
18. | Returns a Date set to the last possible millisecond of the minute. | | |
19. | Returns a Date set to the last possible millisecond of the month, just before midnight. | | |
20. | Returns a java.sql.Timestamp equal to the current time | | |
21. | Returns the number of days within the fragment. | | |
22. | Returns the number of hours within the fragment. | | |
23. | Returns the number of milliseconds within the fragment. | | |
24. | Returns the number of minutes within the fragment. | | |
25. | Returns the number of seconds within the fragment. | | |
26. | Returns true if endDate is after startDate or if startDate equals endDate. | | |
27. | Roll the days forward or backward | | |
28. | Roll the java.sql.Date forward or backward | | |
29. | Roll the java.util.Date forward or backward | | |
30. | Roll the java.util.Time forward or backward | | |
31. | Roll the years forward or backward | | |
32. | Round this date, leaving the field specified as the most significant field. | | |
33. | Checking date as String formatted by a date format | | |
34. | Checks if a calendar date is after today and within a number of days in the future | | |
35. | Checks if a calendar date is today | | |
36. | Checks if a date is after today and within a number of days in the future | | |
37. | Checks if the first calendar date is after the second calendar date ignoring time | | |
38. | Checks if the first calendar date is before the second calendar date ignoring time | | |
39. | Checks if the first date is after the second date ignoring time | | |
40. | Checks if the first date is before the second date ignoring time | | |
41. | Checks if two calendars represent the same day ignoring time | | |
42. | Checks if two dates are on the same day ignoring time | | |
43. | Checks the day, month and year are equal | | |
44. | Checks the hour, minute and second are equal | | |
45. | Make the date go forward of the specified amount of minutes | | |
46. | Make the date go back of the specified amount of days | | |
47. | Returns the maximum of two dates. A null date is treated as being less than any non-null date | | |
48. | Calculate Holidays | | |
49. | Compare two dates | | |
50. | Convert time in milliseconds into a display string of the form [h]h:mm[am|pm] | | |
51. | convert a minute-of-week time to time of day as dd:dd [AM|PM] | | |
52. | Convert a minute-of-week time to time of day as dd:dd (24 hour format) | | |
53. | Convert passed time into an offset string | | |
54. | convert date in milliseconds into the native format of the server - i.e. minute of the week | | |
55. | Convert date in milliseconds into minute of the day | | |
56. | Convert date in minute of the week format into millisecond format | | |
57. | Convert milliseconds into the day of the week string | | |
58. | Convert milliseconds into a short day of the week string | | |
59. | Convert milliseconds into the month of the year string | | |
60. | Convert time to a sliding window format | | |
61. | Get age | | |
62. | Get Next Monday | | |
63. | Get next Sunday | | |
64. | Get File system Path From Date | | |
65. | Get today's date | | |
66. | Get Month, Day of Month, year from a Date | | |
67. | A method to get the last day of a month | | |
68. | Get Age | | |
69. | Get date of yesterday | | |
70. | Get date of last week | | |
71. | Get date of last month | | |
72. | Utility for setting the time on a date. | | |
73. | Get last Date of This Month | | |
74. | General purpose date utilities. | | |
75. | Get Last day from previous Month | | |
76. | Get Local Epoch | | |