General purpose date utilities.
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. The ASF licenses this file to You
* under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License. For additional information regarding
* copyright in this work, please see the NOTICE file in the top level
* directory of this distribution.
*/
//package org.apache.roller.util;
//package org.nex.util;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
/**
* General purpose date utilities.
*
* TODO: all date handling functions need to be aware of locale and timezone.
*/
public abstract class DateUtil {
public static final long millisInDay = 86400000;
// a bunch of date formats
private static final String formatDefaultDate = "dd.MM.yyyy";
private static final String formatDefaultDateMinimal = "d.M.yy";
private static final String formatDefaultTimestamp = "yyyy-MM-dd HH:mm:ss.SSS";
private static final String formatFriendlyTimestamp = "dd.MM.yyyy HH:mm:ss";
private static final String format6chars = "yyyyMM";
private static final String format8chars = "yyyyMMdd";
private static final String formatIso8601 = "yyyy-MM-dd'T'HH:mm:ssZ";
private static final String formatIso8601Day = "yyyy-MM-dd";
private static final String formatRfc822 = "EEE, d MMM yyyy HH:mm:ss Z";
/**
* Returns a Date set to the first possible millisecond of the day, just
* after midnight. If a null day is passed in, a new Date is created.
* midnight (00m 00h 00s)
*/
public static Date getStartOfDay(Date day) {
return getStartOfDay(day, Calendar.getInstance());
}
/**
* Returns a Date set to the first possible millisecond of the day, just
* after midnight. If a null day is passed in, a new Date is created.
* midnight (00m 00h 00s)
*/
public static Date getStartOfDay(Date day, Calendar cal) {
if (day == null) day = new Date();
cal.setTime(day);
cal.set(Calendar.HOUR_OF_DAY, cal.getMinimum(Calendar.HOUR_OF_DAY));
cal.set(Calendar.MINUTE, cal.getMinimum(Calendar.MINUTE));
cal.set(Calendar.SECOND, cal.getMinimum(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cal.getMinimum(Calendar.MILLISECOND));
return cal.getTime();
}
/**
* Returns a Date set to the last possible millisecond of the day, just
* before midnight. If a null day is passed in, a new Date is created.
* midnight (00m 00h 00s)
*/
public static Date getEndOfDay(Date day) {
return getEndOfDay(day,Calendar.getInstance());
}
public static Date getEndOfDay(Date day,Calendar cal) {
if (day == null) day = new Date();
cal.setTime(day);
cal.set(Calendar.HOUR_OF_DAY, cal.getMaximum(Calendar.HOUR_OF_DAY));
cal.set(Calendar.MINUTE, cal.getMaximum(Calendar.MINUTE));
cal.set(Calendar.SECOND, cal.getMaximum(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND));
return cal.getTime();
}
/**
* Returns a Date set to the first possible millisecond of the hour.
* If a null day is passed in, a new Date is created.
*/
public static Date getStartOfHour(Date day) {
return getStartOfHour(day, Calendar.getInstance());
}
/**
* Returns a Date set to the first possible millisecond of the hour.
* If a null day is passed in, a new Date is created.
*/
public static Date getStartOfHour(Date day, Calendar cal) {
if (day == null) day = new Date();
cal.setTime(day);
cal.set(Calendar.MINUTE, cal.getMinimum(Calendar.MINUTE));
cal.set(Calendar.SECOND, cal.getMinimum(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cal.getMinimum(Calendar.MILLISECOND));
return cal.getTime();
}
/**
* Returns a Date set to the last possible millisecond of the day, just
* before midnight. If a null day is passed in, a new Date is created.
* midnight (00m 00h 00s)
*/
public static Date getEndOfHour(Date day) {
return getEndOfHour(day, Calendar.getInstance());
}
public static Date getEndOfHour(Date day, Calendar cal) {
if (day == null || cal == null) {
return day;
}
cal.setTime(day);
cal.set(Calendar.MINUTE, cal.getMaximum(Calendar.MINUTE));
cal.set(Calendar.SECOND, cal.getMaximum(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND));
return cal.getTime();
}
/**
* Returns a Date set to the first possible millisecond of the minute.
* If a null day is passed in, a new Date is created.
*/
public static Date getStartOfMinute(Date day) {
return getStartOfMinute(day, Calendar.getInstance());
}
/**
* Returns a Date set to the first possible millisecond of the minute.
* If a null day is passed in, a new Date is created.
*/
public static Date getStartOfMinute(Date day, Calendar cal) {
if (day == null) day = new Date();
cal.setTime(day);
cal.set(Calendar.SECOND, cal.getMinimum(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cal.getMinimum(Calendar.MILLISECOND));
return cal.getTime();
}
/**
* Returns a Date set to the last possible millisecond of the minute.
* If a null day is passed in, a new Date is created.
*/
public static Date getEndOfMinute(Date day) {
return getEndOfMinute(day, Calendar.getInstance());
}
public static Date getEndOfMinute(Date day, Calendar cal) {
if (day == null || cal == null) {
return day;
}
cal.setTime(day);
cal.set(Calendar.SECOND, cal.getMaximum(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND));
return cal.getTime();
}
/**
* Returns a Date set to the first possible millisecond of the month, just
* after midnight. If a null day is passed in, a new Date is created.
* midnight (00m 00h 00s)
*/
public static Date getStartOfMonth(Date day) {
return getStartOfMonth(day, Calendar.getInstance());
}
public static Date getStartOfMonth(Date day, Calendar cal) {
if (day == null) day = new Date();
cal.setTime(day);
// set time to start of day
cal.set(Calendar.HOUR_OF_DAY, cal.getMinimum(Calendar.HOUR_OF_DAY));
cal.set(Calendar.MINUTE, cal.getMinimum(Calendar.MINUTE));
cal.set(Calendar.SECOND, cal.getMinimum(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cal.getMinimum(Calendar.MILLISECOND));
// set time to first day of month
cal.set(Calendar.DAY_OF_MONTH, 1);
return cal.getTime();
}
/**
* Returns a Date set to the last possible millisecond of the month, just
* before midnight. If a null day is passed in, a new Date is created.
* midnight (00m 00h 00s)
*/
public static Date getEndOfMonth(Date day) {
return getEndOfMonth(day, Calendar.getInstance());
}
public static Date getEndOfMonth(Date day,Calendar cal) {
if (day == null) day = new Date();
cal.setTime(day);
// set time to end of day
cal.set(Calendar.HOUR_OF_DAY, cal.getMaximum(Calendar.HOUR_OF_DAY));
cal.set(Calendar.MINUTE, cal.getMaximum(Calendar.MINUTE));
cal.set(Calendar.SECOND, cal.getMaximum(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND));
// set time to first day of month
cal.set(Calendar.DAY_OF_MONTH, 1);
// add one month
cal.add(Calendar.MONTH, 1);
// back up one day
cal.add(Calendar.DAY_OF_MONTH, -1);
return cal.getTime();
}
/**
* Returns a Date set just to Noon, to the closest possible millisecond
* of the day. If a null day is passed in, a new Date is created.
* nnoon (00m 12h 00s)
*/
public static Date getNoonOfDay(Date day, Calendar cal) {
if (day == null) day = new Date();
cal.setTime(day);
cal.set(Calendar.HOUR_OF_DAY, 12);
cal.set(Calendar.MINUTE, cal.getMinimum(Calendar.MINUTE));
cal.set(Calendar.SECOND, cal.getMinimum(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cal.getMinimum(Calendar.MILLISECOND));
return cal.getTime();
}
/**
* Returns a java.sql.Timestamp equal to the current time
**/
public static java.sql.Timestamp now() {
return new java.sql.Timestamp(new java.util.Date().getTime());
}
/**
* Returns a string the represents the passed-in date parsed
* according to the passed-in format. Returns an empty string
* if the date or the format is null.
**/
public static String format(Date aDate, SimpleDateFormat aFormat) {
if (aDate == null || aFormat == null ) { return ""; }
synchronized (aFormat) {
return aFormat.format(aDate);
}
}
/**
* Returns true if endDate is after startDate or if startDate equals endDate
* or if they are the same date. Returns false if either value is null.
**/
public static boolean isValidDateRange(Date startDate, Date endDate) {
return isValidDateRange(startDate, endDate, true);
}
/**
* Returns true if endDate is after startDate or if startDate equals endDate.
* Returns false if either value is null. If equalOK, returns true if the
* dates are equal.
**/
public static boolean isValidDateRange(Date startDate, Date endDate, boolean equalOK) {
// false if either value is null
if (startDate == null || endDate == null) { return false; }
if (equalOK) {
// true if they are equal
if (startDate.equals(endDate)) { return true; }
}
// true if endDate after startDate
if (endDate.after(startDate)) { return true; }
return false;
}
// convenience method returns minimal date format
public static SimpleDateFormat defaultDateFormat() {
return DateUtil.friendlyDateFormat(true);
}
// convenience method returns minimal date format
public static java.text.SimpleDateFormat minimalDateFormat() {
return friendlyDateFormat(true);
}
// convenience method that returns friendly data format
// using full month, day, year digits.
public static SimpleDateFormat fullDateFormat() {
return friendlyDateFormat(false);
}
/**
* Returns a "friendly" date format.
* @param mimimalFormat Should the date format allow single digits.
**/
public static SimpleDateFormat friendlyDateFormat(boolean minimalFormat) {
if (minimalFormat) {
return new SimpleDateFormat(formatDefaultDateMinimal);
}
return new SimpleDateFormat(formatDefaultDate);
}
// returns full timestamp format
public static SimpleDateFormat defaultTimestampFormat() {
return new SimpleDateFormat(formatDefaultTimestamp);
}
// convenience method returns long friendly timestamp format
public static SimpleDateFormat friendlyTimestampFormat() {
return new SimpleDateFormat(formatFriendlyTimestamp);
}
// convenience method returns minimal date format
public static SimpleDateFormat get8charDateFormat() {
return new SimpleDateFormat(format8chars);
}
// convenience method returns minimal date format
public static SimpleDateFormat get6charDateFormat() {
return new SimpleDateFormat(format6chars);
}
// convenience method returns minimal date format
public static SimpleDateFormat getIso8601DateFormat() {
return new SimpleDateFormat(formatIso8601);
}
// convenience method returns minimal date format
public static SimpleDateFormat getIso8601DayDateFormat() {
return new SimpleDateFormat(formatIso8601Day);
}
// convenience method returns minimal date format
public static SimpleDateFormat getRfc822DateFormat() {
// http://www.w3.org/Protocols/rfc822/Overview.html#z28
// Using Locale.US to fix ROL-725 and ROL-628
return new SimpleDateFormat(formatRfc822, Locale.US);
}
// convenience method
public static String defaultDate(Date date) {
return format(date, defaultDateFormat());
}
// convenience method using minimal date format
public static String minimalDate(Date date) {
return format(date, DateUtil.minimalDateFormat());
}
public static String fullDate(Date date) {
return format(date, DateUtil.fullDateFormat());
}
/**
* Format the date using the "friendly" date format.
*/
public static String friendlyDate(Date date, boolean minimalFormat) {
return format(date, friendlyDateFormat(minimalFormat));
}
// convenience method
public static String friendlyDate(Date date) {
return format(date, friendlyDateFormat(true));
}
// convenience method
public static String defaultTimestamp(Date date) {
return format(date, defaultTimestampFormat());
}
// convenience method returns long friendly formatted timestamp
public static String friendlyTimestamp(Date date) {
return format(date, friendlyTimestampFormat());
}
// convenience method returns 8 char day stamp YYYYMMDD
public static String format8chars(Date date) {
return format(date, get8charDateFormat());
}
// convenience method returns 6 char month stamp YYYYMM
public static String format6chars(Date date) {
return format(date, get6charDateFormat());
}
// convenience method returns long friendly formatted timestamp
public static String formatIso8601Day(Date date) {
return format(date, getIso8601DayDateFormat());
}
public static String formatRfc822(Date date) {
return format(date, getRfc822DateFormat());
}
// This is a hack, but it seems to work
public static String formatIso8601(Date date) {
if (date == null) return "";
// Add a colon 2 chars before the end of the string
// to make it a valid ISO-8601 date.
String str = format(date, getIso8601DateFormat());
StringBuffer sb = new StringBuffer();
sb.append( str.substring(0,str.length()-2) );
sb.append( ":" );
sb.append( str.substring(str.length()-2) );
return sb.toString();
}
}
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. | Utilities to working with dates java.util.Date | | |
49. | Calculate Holidays | | |
50. | Compare two dates | | |
51. | Convert time in milliseconds into a display string of the form [h]h:mm[am|pm] | | |
52. | convert a minute-of-week time to time of day as dd:dd [AM|PM] | | |
53. | Convert a minute-of-week time to time of day as dd:dd (24 hour format) | | |
54. | Convert passed time into an offset string | | |
55. | convert date in milliseconds into the native format of the server - i.e. minute of the week | | |
56. | Convert date in milliseconds into minute of the day | | |
57. | Convert date in minute of the week format into millisecond format | | |
58. | Convert milliseconds into the day of the week string | | |
59. | Convert milliseconds into a short day of the week string | | |
60. | Convert milliseconds into the month of the year string | | |
61. | Convert time to a sliding window format | | |
62. | Get age | | |
63. | Get Next Monday | | |
64. | Get next Sunday | | |
65. | Get File system Path From Date | | |
66. | Get today's date | | |
67. | Get Month, Day of Month, year from a Date | | |
68. | A method to get the last day of a month | | |
69. | Get Age | | |
70. | Get date of yesterday | | |
71. | Get date of last week | | |
72. | Get date of last month | | |
73. | Utility for setting the time on a date. | | |
74. | Get last Date of This Month | | |
75. | Get Last day from previous Month | | |
76. | Get Local Epoch | | |