com.sunchenbin.store.feilong.core.date.DateUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.sunchenbin.store.feilong.core.date.DateUtil.java

Source

/*
 * Copyright (C) 2008 feilong
 *
 * Licensed 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.
 */
package com.sunchenbin.store.feilong.core.date;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import com.sunchenbin.store.feilong.core.text.DateFormatUtil;
import com.sunchenbin.store.feilong.core.util.Validator;

/**
 * {@link java.util.Date}?(feilong-core).
 * 
 * <h3>:</h3>
 * 
 * <blockquote>
 * <table border="1" cellspacing="0" cellpadding="4">
 * <tr style="background-color:#ccccff">
 * <th align="left"></th>
 * <th align="left"></th>
 * </tr>
 * <tr valign="top">
 * <td></td>
 * <td>
 * <ul>
 * <li>{@link DateUtil#string2Date(String, String)}</li>
 * </ul>
 * </td>
 * </tr>
 * <tr valign="top" style="background-color:#eeeeff">
 * <td></td>
 * <td>
 * <ul>
 * <li>{@link DateUtil#date2String(Date, String)}</li>
 * </ul>
 * </td>
 * </tr>
 * <tr valign="top">
 * <td>?</td>
 * <td>
 * <ul>
 * <li>{@link DateUtil#addDay(Date, int)}</li>
 * <li>{@link DateUtil#addHour(Date, int)}</li>
 * <li>{@link DateUtil#addMinute(Date, int)}</li>
 * <li>{@link DateUtil#addMonth(Date, int)}</li>
 * <li>{@link DateUtil#addSecond(Date, int)}</li>
 * <li>{@link DateUtil#addWeek(Date, int)}</li>
 * <li>{@link DateUtil#addYear(Date, int)}</li>
 * </ul>
 * </td>
 * </tr>
 * <tr valign="top" style="background-color:#eeeeff">
 * <td>?</td>
 * <td>
 * <ul>
 * <li>{@link DateUtil#getDayOfMonth(Date)}</li>
 * <li>{@link DateUtil#getDayOfWeek(Date)}</li>
 * <li>{@link DateUtil#getDayOfYear(Date)}</li>
 * <li>{@link DateUtil#getHourOfDay(Date)}</li>
 * <li>{@link DateUtil#getHourOfYear(Date)}</li>
 * <li>{@link DateUtil#getMinute(Date)}</li>
 * <li>{@link DateUtil#getMonth(Date)}</li>
 * <li>{@link DateUtil#getSecond(Date)}</li>
 * <li>{@link DateUtil#getYear(Date)}</li>
 * <li>{@link DateUtil#getTime(Date)}</li>
 * </ul>
 * </td>
 * </tr>
 * <tr valign="top">
 * <td></td>
 * <td>
 * <ul>
 * <li>{@link DateUtil#getIntervalDay(long)}</li>
 * <li>{@link DateUtil#getIntervalDay(Date, Date)}</li>
 * <li>{@link DateUtil#getIntervalDay(String, String, String)}</li>
 * 
 * <li>{@link DateUtil#getIntervalWeek(long)}</li>
 * <li>{@link DateUtil#getIntervalWeek(Date, Date)}</li>
 * <li>{@link DateUtil#getIntervalWeek(String, String, String)}</li>
 * 
 * <li>{@link DateUtil#getIntervalHour(long)}</li>
 * <li>{@link DateUtil#getIntervalHour(Date, Date)}</li>
 * 
 * <li>{@link DateUtil#getIntervalMinute(long)}</li>
 * <li>{@link DateUtil#getIntervalSecond(long)}</li>
 * <li>{@link DateUtil#getIntervalSecond(Date, Date)}</li>
 * 
 * <li>{@link DateUtil#getIntervalTime(Date, Date)}</li>
 * </ul>
 * </td>
 * </tr>
 * <tr valign="top" style="background-color:#eeeeff">
 * <td></td>
 * <td>
 * <ul>
 * <li>{@link DateUtil#isLeapYear(int)}</li>
 * </ul>
 * </td>
 * </tr>
 * <tr valign="top">
 * <td></td>
 * <td>
 * <ul>
 * <li>{@link DateUtil#isEquals(Date, Date, String)}</li>
 * </ul>
 * </td>
 * </tr>
 * <tr valign="top" style="background-color:#eeeeff">
 * <td></td>
 * <td>
 * <ul>
 * <li>{@link DateUtil#isBefore(Date, String, String)}</li>
 * <li>{@link DateUtil#isBefore(String, String, String)}</li>
 * </ul>
 * </td>
 * </tr>
 * <tr valign="top">
 * <td></td>
 * <td>
 * <ul>
 * <li>{@link DateUtil#isInTime(Date, Date, Date)}</li>
 * <li>{@link DateUtil#isInTime(Date, String, String, String)}</li>
 * </ul>
 * </td>
 * </tr>
 * </table>
 * </blockquote>
 * 
 * <h3>,??:</h3>
 * 
 * <blockquote>
 * <table border="1" cellspacing="0" cellpadding="4">
 * <tr style="background-color:#ccccff">
 * <th align="left"></th>
 * <th align="left"></th>
 * </tr>
 * <tr valign="top">
 * <td></td>
 * <td>Date nextWeekDay = addDay(date, 7);<br>
 * return getFirstDateOfThisWeek(nextWeekDay);</td>
 * </tr>
 * <tr valign="top" style="background-color:#eeeeff">
 * <td>?</td>
 * <td>Date nextWeekDay = addDay(date, 7);<br>
 * return getLastDateOfThisWeek(nextWeekDay);</td>
 * </tr>
 * <tr valign="top">
 * <td></td>
 * <td>Date nextWeekDay = addDay(date, -7);<br>
 * return getFirstDateOfThisWeek(nextWeekDay);</td>
 * </tr>
 * <tr valign="top" style="background-color:#eeeeff">
 * <td>?</td>
 * <td>Date nextWeekDay = addDay(date, -7);<br>
 * return getLastDateOfThisWeek(nextWeekDay);</td>
 * </tr>
 * <tr valign="top">
 * <td></td>
 * <td>return DateUtil.getFirstDateOfThisMonth(DateUtil.addMonth(now, +1)));</td>
 * </tr>
 * <tr valign="top" style="background-color:#eeeeff">
 * <td>?</td>
 * <td>return DateUtil.getLastDateOfThisMonth(DateUtil.addMonth(now, +1)));</td>
 * </tr>
 * <tr valign="top">
 * <td></td>
 * <td>return DateUtil.getFirstDateOfThisMonth(DateUtil.addMonth(now, -1)));</td>
 * </tr>
 * <tr valign="top" style="background-color:#eeeeff">
 * <td>?</td>
 * <td>return DateUtil.getLastDateOfThisMonth(DateUtil.addMonth(now, -1)));</td>
 * </tr>
 * <tr valign="top">
 * <td></td>
 * <td>return DateUtil.getFirstDateOfThisYear(DateUtil.addYear(now, -1));</td>
 * </tr>
 * <tr valign="top" style="background-color:#eeeeff">
 * <td>?</td>
 * <td>return DateUtil.getLastDateOfThisYear(DateUtil.addYear(now, -1)));</td>
 * </tr>
 * <tr valign="top">
 * <td></td>
 * <td>return DateUtil.getFirstDateOfThisYear(DateUtil.addYear(now, +1));</td>
 * </tr>
 * <tr valign="top" style="background-color:#eeeeff">
 * <td>?</td>
 * <td>return DateUtil.getLastDateOfThisYear(DateUtil.addYear(now, +1)));</td>
 * </tr>
 * </table>
 * </blockquote>
 * 
 * @author feilong
 * @version 1.0.0 2010-1-27 ?01:53:21
 * @version 1.0.5 2014-5-6 10:04
 * @see CalendarUtil
 * @see DatePattern
 * @see DateFormatUtil
 * @see org.apache.commons.lang3.time.DateUtils
 * @since 1.0.0
 */
public final class DateUtil {

    /** Don't let anyone instantiate this class. */
    private DateUtil() {
        //AssertionError?. ?????. ???.
        //see Effective Java 2nd
        throw new AssertionError("No " + getClass().getName() + " instances for you!");
    }

    // *****************************week****************************************************
    /**
     * date <span style="color:red"> ()</span> <code>00:00:00.000</code> .
     * <p>
     * ?:,<span style="color:red">,?</span><br>
     * ?:,?
     * </p>
     * 
     * <pre>
     *   2012-10-11 17:10:30.701(),
     * return 2012-10-07 00:00:00.000
     * 
     * 
     * getFirstDateOfThisWeek(2014-01-01 05:00:00)
     * return 2013-12-29 00:00:00.000
     * </pre>
     * 
     * @param date
     *            the date
     * @return date  <code>00:00:00.000</code> 
     * @see #toCalendar(Date)
     * @see Calendar#set(int, int)
     * @see CalendarUtil#resetDayBegin(Calendar)
     * @see Calendar#getTime()
     */
    public static Date getFirstDateOfThisWeek(Date date) {
        Calendar calendar = toCalendar(date);
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        CalendarUtil.resetDayBegin(calendar);
        return CalendarUtil.toDate(calendar);
    }

    /**
     * date <span style="color:red">?()</span> <code>23:59:59.999</code> .
     * 
     * <p>
     * ?:,<span style="color:red">,?</span><br>
     * ?:,?
     * </p>
     * 
     * <pre>
     *   2012-10-11 17:10:30.701 (),
     * return 2012-10-13 23:59:59.999
     * 
     * 
     * getLastDateOfThisWeek(2014-12-31 05:00:00)
     * return 2015-01-03 23:59:59.999
     * </pre>
     * 
     * @param date
     *            ?date
     * @return date ? <code>23:59:59.999</code> 
     * @see #toCalendar(Date)
     * @see Calendar#set(int, int)
     * @see CalendarUtil#resetDayEnd(Calendar)
     * @see Calendar#getTime()
     * @since 1.0.1
     */
    public static Date getLastDateOfThisWeek(Date date) {
        Calendar calendar = toCalendar(date);
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
        CalendarUtil.resetDayEnd(calendar);
        return CalendarUtil.toDate(calendar);
    }

    // *********************************************************************************

    /**
     * ,<code>00:00:00</code> .
     * 
     * <p>
     *   2012-10-11 17:10:30.701 (),<br>
     * return 2012-10-01 00:00:00
     * </p>
     * 
     * @param date
     *            the date
     * @return Date
     * @see #toCalendar(Date)
     * @see Calendar#set(int, int)
     * @see CalendarUtil#resetDayBegin(Calendar)
     * @see Calendar#getTime()
     */
    public static Date getFirstDateOfThisMonth(Date date) {
        Calendar calendar = toCalendar(date);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        CalendarUtil.resetDayBegin(calendar);
        return CalendarUtil.toDate(calendar);
    }

    /**
     * <span style="color:red">?</span> <code>23:59:59.999</code> .
     * <p>
     * ?,,2 2829
     * </p>
     * 
     * <pre>
     *   2012-10-11 17:10:30.701,
     * return 2012-10-31 23:59:59.999
     * </pre>
     * 
     * @param date
     *            the date
     * @return Date
     * @see #toCalendar(Date)
     * @see Calendar#set(int, int)
     * @see CalendarUtil#resetDayEnd(Calendar)
     * @see Calendar#getTime()
     */
    public static Date getLastDateOfThisMonth(Date date) {
        Calendar calendar = toCalendar(date);
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        CalendarUtil.resetDayEnd(calendar);
        return CalendarUtil.toDate(calendar);
    }

    /**
     * <span style="color:red"></span>,<code>00:00:00.000</code> .
     * 
     * <pre>
     *   2012-10-11 17:10:30.701,
     * return 2012-01-01 00:00:00
     * </pre>
     * 
     * @param date
     *            
     * @return date
     * @see #toCalendar(Date)
     * @see Calendar#set(int, int)
     * @see CalendarUtil#resetDayBegin(Calendar)
     * @see Calendar#getTime()
     */
    public static Date getFirstDateOfThisYear(Date date) {
        Calendar calendar = toCalendar(date);
        calendar.set(Calendar.MONTH, Calendar.JANUARY);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        CalendarUtil.resetDayBegin(calendar);
        return CalendarUtil.toDate(calendar);
    }

    /**
     *  <code>week</code>.
     * 
     * <pre>
     *   2015-7-29 14:08
     * 
     * DateUtil.getFirstWeekOfSpecifyDateYear(NOW, Calendar.FRIDAY)
     * return 2015-01-02 00:00:00.000
     * 
     * DateUtil.getFirstWeekOfSpecifyDateYear(NOW, Calendar.MONDAY)
     * return 2015-01-05 00:00:00.000
     * </pre>
     * 
     * @param date
     *            
     * @param week
     *             1 ?2 3 4 5 6 7, ? {@link Calendar#SUNDAY}, {@link Calendar#MONDAY}, {@link Calendar#TUESDAY},
     *            {@link Calendar#WEDNESDAY}, {@link Calendar#THURSDAY}, {@link Calendar#FRIDAY}, {@link Calendar#SATURDAY}
     * @return the first week of specify date year
     * @see Calendar#SUNDAY
     * @see Calendar#MONDAY
     * @see Calendar#TUESDAY
     * @see Calendar#WEDNESDAY
     * @see Calendar#THURSDAY
     * @see Calendar#FRIDAY
     * @see Calendar#SATURDAY
     * @since 1.3.0
     */
    public static Date getFirstWeekOfSpecifyDateYear(Date date, int week) {
        Calendar calendar = toCalendar(date);
        calendar.clear();
        calendar.set(Calendar.YEAR, getYear(date));
        calendar.set(Calendar.MONTH, Calendar.JANUARY);
        calendar.set(Calendar.DAY_OF_WEEK_IN_MONTH, 1);
        calendar.set(Calendar.DAY_OF_WEEK, week);

        //DAY_OF_WEEK_IN_MONTH ? DAY_OF_WEEK ,???
        // WEEK_OF_MONTH  WEEK_OF_YEAR ??,? ? getFirstDayOfWeek()  getMinimalDaysInFirstWeek()

        //DAY_OF_MONTH 1  7  DAY_OF_WEEK_IN_MONTH 1
        //8  14  DAY_OF_WEEK_IN_MONTH 2,?
        //DAY_OF_WEEK_IN_MONTH 0  DAY_OF_WEEK_IN_MONTH 1 ?
        //?,,? DAY_OF_WEEK = SUNDAY, DAY_OF_WEEK_IN_MONTH = -1
        //?,????
        //, 31 , DAY_OF_WEEK_IN_MONTH -1  DAY_OF_WEEK_IN_MONTH 5  DAY_OF_WEEK_IN_MONTH 4 ??
        return CalendarUtil.toDate(calendar);
    }

    /**
     * <span style="color:red">?</span> <code>23:59:59.999</code> <br>
     * 
     * <pre>
     *   2012-10-11 17:10:30.701,
     * 
     * return 2012-12-31 23:59:59.999
     * </pre>
     * 
     * @param date
     *            ?date
     * @return Date
     * @see #toCalendar(Date)
     * @see Calendar#set(int, int)
     * @see CalendarUtil#resetDayEnd(Calendar)
     * @see Calendar#getTime()
     */
    public static Date getLastDateOfThisYear(Date date) {
        Calendar calendar = toCalendar(date);
        calendar.set(Calendar.MONTH, Calendar.DECEMBER);
        calendar.set(Calendar.DAY_OF_MONTH, 31);
        CalendarUtil.resetDayEnd(calendar);
        return CalendarUtil.toDate(calendar);
    }

    // [start]operate ?(?)

    /**
     * ,?( {@link java.util.Calendar#YEAR}?,??),,.
     * 
     * <pre>
     * addYear(2012-06-29 00:33:05,5)
     * return 20<span style="color:red">17</span>-06-29 00:33:05
     * 
     * addYear(2012-06-29 00:33:05,-5)
     * return 20<span style="color:red">07</span>-06-29 00:33:05
     * </pre>
     * 
     * @param date
     *            
     * @param year
     *             ? ??
     * @return ??
     * @see #operateDate(Date, int, int)
     * @see Calendar#YEAR
     * @see org.apache.commons.lang3.time.DateUtils#addYears(Date, int)
     */
    public static Date addYear(Date date, int year) {
        return operateDate(date, Calendar.YEAR, year);
    }

    /**
     * ?,( {@link java.util.Calendar#MONTH}?,??),,.
     * 
     * <pre>
     * addMonth(2012-10-16 23:12:43,5)
     * return 2013-03-16 23:12:43.932
     * 
     * addMonth(2012-10-16 23:12:43,-5)
     * return 2012-05-16 23:12:43.943
     * </pre>
     * 
     * @param date
     *            
     * @param month
     *            ?, <span style="color:red">?</span>,??<br>
     *            -3  3?
     * @return ??
     * @see #operateDate(Date, int, int)
     * @see Calendar#MONTH
     * @see org.apache.commons.lang3.time.DateUtils#addMonths(Date, int)
     */
    public static Date addMonth(Date date, int month) {
        return operateDate(date, Calendar.MONTH, month);
    }

    /**
     * ? ( {@link java.util.Calendar#DAY_OF_MONTH}?,??),,.
     * 
     * <pre>
     * addDay(2012-06-29 00:42:26,5)
     * return 2012-07-04 00:42:26
     * 
     * addDay(2012-06-29 00:42:26,-5)
     * return 2012-06-24 00:42:26
     * 
     * addDay(2014-12-31 02:10:05,5)
     * return 2015-01-05 02:10:05.000
     * 
     * addDay(2014-01-01 02:10:05,-5)
     * return 2013-12-27 02:10:05.000
     * </pre>
     * 
     * @param date
     *            
     * @param day
     *            ??,<span style="color:red">?</span>,??<br>
     * @return ?
     * @see #operateDate(Date, int, int)
     * @see Calendar#DAY_OF_MONTH
     * @see org.apache.commons.lang3.time.DateUtils#addDays(Date, int)
     */
    public static Date addDay(Date date, int day) {
        // Calendar.DAY_OF_MONTH  Calendar.DATE ??. 1.
        return operateDate(date, Calendar.DAY_OF_MONTH, day);
    }

    /**
     * ? ({@link Calendar#WEEK_OF_YEAR}?,??),,.
     * 
     * <pre>
     * Example 1:
     * addWeek(2012-06-29 00:45:18,5)
     * return 2012-08-03 00:45:18
     * 
     * Example 2:
     * addWeek(2012-06-29 00:45:18,-5)
     * return 2012-05-25 00:45:18
     * </pre>
     * 
     * @param date
     *            
     * @param week
     *            ??,<span style="color:red">?</span>,??<br>
     * @return ?
     * @see #operateDate(Date, int, int)
     * @see Calendar#WEEK_OF_YEAR
     */
    public static Date addWeek(Date date, int week) {
        return operateDate(date, Calendar.WEEK_OF_YEAR, week);
    }

    /**
     * ?? ({@link Calendar#HOUR_OF_DAY} 24??,??),,.
     * 
     * <pre>
     * addHour(2012-06-29 00:46:24,5)
     * return 2012-06-29 05:46:24
     * 
     * addHour(2012-06-29 00:46:24,-5)
     * return 2012-06-28 19:46:24
     * </pre>
     * 
     * <p>
     * {@link Calendar#HOUR}12?? <br>
     * {@link Calendar#HOUR_OF_DAY}24??
     * </p>
     * 
     * @param date
     *            the date
     * @param hour
     *            the hour,<span style="color:red">?</span>,??<br>
     * @return the date
     * @see #operateDate(Date, int, int)
     * @see Calendar#HOUR_OF_DAY
     * @see org.apache.commons.lang3.time.DateUtils#addHours(Date, int)
     */
    public static Date addHour(Date date, int hour) {
        return operateDate(date, Calendar.HOUR_OF_DAY, hour);
    }

    /**
     * ? ({@link Calendar#MINUTE}?,??),,.
     * 
     * <pre>
     * addMinute(2012-10-16 23:20:33,180)
     * return 2012-10-17 02:20:33.669
     * 
     * addMinute(2012-10-16 23:20:33,-180)
     * return 2012-10-16 20:20:33.669
     * </pre>
     * 
     * @param date
     *            the date
     * @param minute
     *            the minute,<span style="color:red">?</span>,??<br>
     * @return the date
     * @see #operateDate(Date, int, int)
     * @see Calendar#MINUTE
     * @see org.apache.commons.lang3.time.DateUtils#addMinutes(Date, int)
     */
    public static Date addMinute(Date date, int minute) {
        return operateDate(date, Calendar.MINUTE, minute);
    }

    /**
     * ? ({@link java.util.Calendar#SECOND}?,??),,.
     * 
     * <pre>
     * addSecond(2012-10-16 23:22:02,180)
     * return 2012-10-16 23:25:02.206
     * 
     * addSecond(2012-10-16 23:22:02,-180)
     * return 2012-10-16 23:19:02.206
     * </pre>
     * 
     * @param date
     *            ?
     * @param second
     *            ?,<span style="color:red">?</span>,??<br>
     * @return the date
     * @see #operateDate(Date, int, int)
     * @see Calendar#SECOND
     * @see org.apache.commons.lang3.time.DateUtils#addSeconds(Date, int)
     */
    public static Date addSecond(Date date, int second) {
        return operateDate(date, Calendar.SECOND, second);
    }

    /**
     * ? ({@link java.util.Calendar#MILLISECOND}?,??),,.
     * 
     * <h3>:</h3>
     * 
     * <blockquote>
     * 
     * <pre>
     * addMillisecond(2015-09-07 13:35:02.769,5000)
     * return 2015-09-07 13:35:07.769
     * 
     * addMillisecond(2015-09-07 13:35:02.769,-5000)
     * return 2015-09-07 13:34:57.769
     * </pre>
     * 
     * </blockquote>
     * 
     * @param date
     *            ?
     * @param millisecond
     *            ?,<span style="color:red">?</span>,??<br>
     * @return the date
     * @see #operateDate(Date, int, int)
     * @see Calendar#MILLISECOND
     * @see org.apache.commons.lang3.time.DateUtils#addMilliseconds(Date, int)
     * @since 1.4.1
     */
    public static Date addMillisecond(Date date, int millisecond) {
        return operateDate(date, Calendar.MILLISECOND, millisecond);
    }

    /**
     * ?, ?,??.
     * 
     * @param currentDate
     *            ?date
     * @param field
     *            
     * @param amount
     *            ?,?
     * @return ? ?,??
     * @see #addYear(Date, int)
     * @see #addMonth(Date, int)
     * @see #addWeek(Date, int)
     * @see #addDay(Date, int)
     * @see #addHour(Date, int)
     * @see #addMinute(Date, int)
     * @see #addSecond(Date, int)
     * @see #addMillisecond(Date, int)
     * @see #toCalendar(Date)
     * @see Calendar#add(int, int)
     * @see org.apache.commons.lang3.time.DateUtils#add(Date, int, int)
     */
    public static Date operateDate(Date currentDate, int field, int amount) {
        Calendar calendar = toCalendar(currentDate);
        calendar.add(field, amount);
        return CalendarUtil.toDate(calendar);
    }

    // [end]

    // [start]fieldValue?
    /**
     * ? {@link java.util.Calendar#YEAR}.
     * 
     * <pre>
     * 2012-06-29
     * return 2012
     * </pre>
     * 
     * @param date
     *            the date
     * @return ?
     * @see CalendarUtil#getFieldValue(Date, int)
     * @see Calendar#YEAR
     */
    public static int getYear(Date date) {
        return CalendarUtil.getFieldValue(date, Calendar.YEAR);
    }

    /**
     * ?{@link java.util.Calendar#MONTH}<span style="color:red">(?+1?)</span>.
     * 
     * <pre>
     * 2012-06-29
     * return 6
     * </pre>
     * 
     * @param date
     *            the date
     * @return ?
     * @see CalendarUtil#getFieldValue(Date, int)
     * @see Calendar#MONTH
     */
    public static int getMonth(Date date) {
        return 1 + CalendarUtil.getFieldValue(date, Calendar.MONTH);
    }

    /**
     * ?{@link Calendar#WEEK_OF_YEAR}, 1,52(365/7=52.14).
     * 
     * <p>
     * ?:<br>
     * 20141-1 1-2 1-3 1-4 WEEK_OF_YEAR 1; <br>
     * 201412-28 12-29 12-30 12-31 WEEK_OF_YEAR 1
     * </p>
     * 
     * <pre>
     * 
     * Example 1:
     * 2014-06-03
     * return 23
     * 
     * Example 2:
     * 2014-01-01
     * return 1
     * 
     * Example 3:
     * 2014-12-29
     * return 23
     * 
     * Example 4:
     * 2014-12-20
     * return 51
     * 
     * Example 5:
     * 2014-12-26
     * return 52
     * </pre>
     * 
     * {@link Calendar#setMinimalDaysInFirstWeek(int)} ???,7?
     * 
     * <pre>
     * 
     * Example 1:
     * 2014-01-01
     * return 52
     * 
     * Example 3:
     * 2014-12-31
     * return 52
     * </pre>
     * 
     * ?,11??,?7,11?
     * 
     * @param date
     *            the date
     * @return ?
     * @see CalendarUtil#getFieldValue(Date, int)
     * @see Calendar#WEEK_OF_YEAR
     * @see Calendar#getFirstDayOfWeek()
     * @see Calendar#getMinimalDaysInFirstWeek()
     * @see Calendar#setMinimalDaysInFirstWeek(int)
     * @since 1.0.7
     */
    public static int getWeekOfYear(Date date) {
        return CalendarUtil.getFieldValue(date, Calendar.WEEK_OF_YEAR);
    }

    /**
     * ?().
     * 
     * <pre>
     * 2013-01-01
     * return 1
     * 
     * 2013-01-05
     * return 5
     * </pre>
     * 
     * @param date
     *            the date
     * @return ?()
     * @see com.sunchenbin.store.feilong.core.date.CalendarUtil#getDayOfYear(int, int, int)
     * @see #getFirstDateOfThisYear(Date)
     * @see #getIntervalDay(Date, Date)
     * @since 1.0.2
     */
    public static int getDayOfYear(Date date) {
        Date firstDateOfThisYear = getFirstDateOfThisYear(date);
        return getIntervalDay(date, firstDateOfThisYear) + 1;
    }

    /**
     * ?{@link Calendar#DAY_OF_MONTH}.
     * 
     * <pre>
     * 2012-06-29
     * return 29
     * </pre>
     * 
     * @param date
     *            the date
     * @return ?
     * @see CalendarUtil#getFieldValue(Date, int)
     * @see Calendar#DAY_OF_MONTH
     */
    public static int getDayOfMonth(Date date) {
        return CalendarUtil.getFieldValue(date, Calendar.DAY_OF_MONTH);
    }

    /**
     * ?{@link Calendar#DAY_OF_WEEK}.
     * 
     * <p style="color:red">
     * ,1.
     * </p>
     * 
     * <pre>
     * SUNDAY?MONDAY?TUESDAY?WEDNESDAY?THURSDAY?FRIDAY  SATURDAY
     * 
     * 1-7
     * </pre>
     * 
     * <pre>
     * 2012-6-29  5
     * return 6
     * </pre>
     * 
     * @param date
     *            the date
     * @return ?
     * @see Calendar#SUNDAY
     * @see Calendar#MONDAY
     * @see Calendar#TUESDAY
     * @see Calendar#WEDNESDAY
     * @see Calendar#THURSDAY
     * @see Calendar#FRIDAY
     * @see Calendar#SATURDAY
     * @see CalendarUtil#getFieldValue(Date, int)
     * @see Calendar#DAY_OF_WEEK
     */
    public static int getDayOfWeek(Date date) {
        return CalendarUtil.getFieldValue(date, Calendar.DAY_OF_WEEK);
    }

    /**
     * ?(24?) {@link Calendar#HOUR_OF_DAY}.
     * 
     * <pre>
     * 2012-6-29 00:26:53
     * return 0
     * </pre>
     * 
     * @param date
     *            date
     * @return ?
     * @see CalendarUtil#getFieldValue(Date, int)
     * @see Calendar#HOUR_OF_DAY
     */
    public static int getHourOfDay(Date date) {
        return CalendarUtil.getFieldValue(date, Calendar.HOUR_OF_DAY);
    }

    /**
     * date  ?.
     * <p>
     * max value: 8784.
     * </p>
     * 
     * <pre>
     * 
     * 2013-01-01 00:00:05
     * return 0
     * 
     * 2013-01-01 01:00:05
     * return 1
     * 
     * 2013-01-05 12:00:05
     * return 108
     * 
     * 2013-09-09 17:28
     * return 6041
     * </pre>
     * 
     * @param date
     *            date
     * @return date  ?
     * @see #getFirstDateOfThisYear(Date)
     * @see #getIntervalHour(Date, Date)
     * @since 1.0.2
     */
    public static int getHourOfYear(Date date) {
        Date firstDateOfThisYear = getFirstDateOfThisYear(date);
        return getIntervalHour(firstDateOfThisYear, date);
    }

    /**
     *  {@link java.util.Calendar#MINUTE}.
     * 
     * <pre>
     * 2012-6-29 00:26:53
     * return 26
     * </pre>
     * 
     * @param date
     *            date
     * @return 
     * @see CalendarUtil#getFieldValue(Date, int)
     * @see Calendar#MINUTE
     */
    public static int getMinute(Date date) {
        return CalendarUtil.getFieldValue(date, Calendar.MINUTE);
    }

    /**
     * {@link java.util.Calendar#SECOND}.
     * 
     * <pre>
     * 2012-6-29 00:26:53
     * return 53
     * </pre>
     * 
     * @param date
     *            date
     * @return 
     * @see CalendarUtil#getFieldValue(Date, int)
     * @see Calendar#SECOND
     */
    public static int getSecond(Date date) {
        return CalendarUtil.getFieldValue(date, Calendar.SECOND);
    }

    /**
     * ,86400 {@link TimeInterval#SECONDS_PER_DAY}.
     * 
     * <pre>
     * 2013-09-09 16:42:41
     * return 60161
     * </pre>
     * 
     * @param date
     *            date
     * @return ?
     * @see TimeInterval#SECONDS_PER_DAY
     * @see TimeInterval#SECONDS_PER_HOUR
     * @see #getSecondOfHour(Date)
     * @since 1.0.2
     */
    public static int getSecondOfDay(Date date) {
        int hour = getHourOfDay(date);
        return hour * TimeInterval.SECONDS_PER_HOUR + getSecondOfHour(date);
    }

    /**
     * ??,3600 {@link TimeInterval#SECONDS_PER_HOUR}.
     * 
     * <pre>
     * 2013-09-15 01:15:23
     * return 923
     * </pre>
     * 
     * @param date
     *            date
     * @return ??
     * @see TimeInterval#SECONDS_PER_MINUTE
     * @see TimeInterval#SECONDS_PER_HOUR
     * @since 1.0.2
     */
    public static int getSecondOfHour(Date date) {
        int minute = getMinute(date);
        int second = getSecond(date);
        return second + minute * TimeInterval.SECONDS_PER_MINUTE;
    }

    /**
     *  1970  1  1  00:00:00 GMT ?, Date .
     * 
     * <pre>
     * 2012-6-29 00:28
     * return 1340900883288
     * </pre>
     * 
     * @param date
     *            date
     * @return date.getTime()
     */
    public static long getTime(Date date) {
        return date.getTime();
    }

    // [end]

    // [start]date2String/string2Date ?

    /**
     * ???.
     * 
     * <pre>
     * date2String(Tue Oct 16 23:49:21 CST 2012,DatePattern.commonWithMillisecond)
     * return 2012-10-16 23:49:21.525
     * </pre>
     * 
     * @param date
     *            ?
     * @param datePattern
     *            ? {@link DatePattern}
     * @return string
     * @see DateFormatUtil#format(Date, String)
     */
    public static String date2String(Date date, String datePattern) {
        return DateFormatUtil.format(date, datePattern);
    }

    /**
     * string??date.
     * 
     * @param dateString
     *            
     * @param datePattern
     *            ?,?{@link DatePattern}
     * @return string??date
     * @see DateFormatUtil#parse(String, String)
     */
    public static Date string2Date(String dateString, String datePattern) {
        return DateFormatUtil.parse(dateString, datePattern);
    }

    // [end]

    // [start]interval

    /**
     * .
     * 
     * @param spaceMillisecond
     *            
     * @return 
     * @see TimeInterval#MILLISECOND_PER_MINUTE
     */
    public static int getIntervalMinute(long spaceMillisecond) {
        return (int) (spaceMillisecond / (TimeInterval.MILLISECOND_PER_MINUTE));
    }

    /**
     * .
     * 
     * @param date1
     *            the date1
     * @param date2
     *            the date2
     * @return 
     * @see #getIntervalTime(Date, Date)
     * @see #getIntervalSecond(long)
     * @since 1.0.2
     */
    public static int getIntervalSecond(Date date1, Date date2) {
        long intervalTime = getIntervalTime(date1, date2);
        return getIntervalSecond(intervalTime);
    }

    /**
     * .
     * 
     * @param spaceMillisecond
     *            
     * @return 
     */
    public static int getIntervalSecond(long spaceMillisecond) {
        return (int) (spaceMillisecond / 1000);
    }

    /**
     * ?.
     * 
     * @param date1
     *            date1
     * @param date2
     *            date2
     * @return ?
     * @see #getIntervalTime(Date, Date)
     * @see #getIntervalHour(long)
     */
    public static int getIntervalHour(Date date1, Date date2) {
        long intervalTime = getIntervalTime(date1, date2);
        return getIntervalHour(intervalTime);
    }

    /**
     * ?.
     * 
     * @param spaceMillisecond
     *            
     * @return ?
     * @see TimeInterval#MILLISECOND_PER_HOUR
     */
    public static int getIntervalHour(long spaceMillisecond) {
        return (int) (spaceMillisecond / (TimeInterval.MILLISECOND_PER_HOUR));
    }

    /**
     * .
     *
     * @param date1
     *            the date1
     * @param date2
     *            the date2
     * @param datePattern
     *            pattern {@link DatePattern}
     * @return the interval week
     * @see #getIntervalWeek(Date, Date)
     * @since 1.2.1
     */
    public static int getIntervalWeek(String date1, String date2, String datePattern) {
        Date dateOne = string2Date(date1, datePattern);
        Date dateTwo = string2Date(date2, datePattern);
        return getIntervalWeek(dateOne, dateTwo);
    }

    /**
     * .
     *
     * @param date1
     *            the date1
     * @param date2
     *            the date2
     * @return the interval week
     * @see #getIntervalWeek(long)
     * @since 1.2.1
     */
    public static int getIntervalWeek(Date date1, Date date2) {
        long intervalTime = getIntervalTime(date1, date2);
        return getIntervalWeek(intervalTime);
    }

    /**
     * .
     *
     * @param spaceTime
     *            the space time
     * @return the interval week
     * @see com.sunchenbin.store.feilong.core.date.TimeInterval#SECONDS_PER_WEEK
     * @since 1.2.1
     */
    public static int getIntervalWeek(long spaceTime) {
        return (int) (spaceTime / (TimeInterval.MILLISECOND_PER_WEEK));
    }

    //-******************getIntervalDay***************************************

    /**
     * .
     * 
     * @param date1
     *            date1
     * @param date2
     *            date2
     * @param datePattern
     *            ? {@link DatePattern}
     * @return 
     * @see #string2Date(String, String)
     * @see #getIntervalTime(Date, Date)
     * @see #getIntervalDay(long)
     */
    public static int getIntervalDay(String date1, String date2, String datePattern) {
        Date dateOne = string2Date(date1, datePattern);
        Date dateTwo = string2Date(date2, datePattern);
        return getIntervalDay(dateOne, dateTwo);
    }

    /**
     * .
     * 
     * @param date1
     *            date1
     * @param date2
     *            date2
     * @return 
     * @see #getIntervalTime(Date, Date)
     * @see #getIntervalDay(long)
     */
    public static int getIntervalDay(Date date1, Date date2) {
        long intervalTime = getIntervalTime(date1, date2);
        return getIntervalDay(intervalTime);
    }

    /**
     * .
     * 
     * @param spaceTime
     *            
     * @return 
     * @see TimeInterval#SECONDS_PER_DAY
     */
    public static int getIntervalDay(long spaceTime) {
        return (int) (spaceTime / (TimeInterval.MILLISECOND_PER_DAY));
    }

    /**
     * ,?date1?date2,? <span style="color:red">?</span>.
     * 
     * @param date1
     *            date1
     * @param date2
     *            date2
     * @return ,?date1?date2,??
     * @see #getTime(Date)
     * @see Math#abs(long)
     */
    public static long getIntervalTime(Date date1, Date date2) {
        return Math.abs(getTime(date2) - getTime(date1));
    }

    // [end]

    // [start]toCalendar

    /**
     * date?Calendar, {@link GregorianCalendar}.
     * 
     * <p>
     * {@link Calendar#getInstance()},???GregorianCalendar,<br>
     *  java.util.Calendar.createCalendar(TimeZone, Locale) ,<br>
     * Locale(), {@link GregorianCalendar#GregorianCalendar(java.util.TimeZone, java.util.Locale)} 
     * </p>
     * 
     * <h3>{@link GregorianCalendar}</h3>
     * 
     * <blockquote>
     * <p>
     * /,?""
     * </p>
     * </blockquote>
     *
     * @param date
     *            date
     * @return Calendar
     * @see Calendar#getInstance()
     * @see GregorianCalendar
     * @see Calendar#setTime(Date)
     * @see Calendar#setTimeInMillis(long)
     * 
     * @see org.apache.commons.lang3.time.DateUtils#toCalendar(Date)
     */
    public static Calendar toCalendar(Date date) {
        if (Validator.isNullOrEmpty(date)) {
            throw new NullPointerException("date can't be null/empty!");
        }
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        return calendar;
    }

    // [end]

    // [start]isBefore 

    /**
     * ??,?Date, date_before ?date_after.
     * 
     * <p>
     * :
     * </p>
     * 
     * <pre>
     * isBefore("2011-05-01","2011-04-01",DateUtil.pattern_onlyDate)
     * return true
     * </pre>
     *
     * @param dateBefore
     *            the date before
     * @param dateAfter
     *            the date after
     * @param datePattern
     *            pattern {@link DatePattern}
     * @return date_before  date_after true
     * @see #string2Date(String, String)
     * @see #isBefore(Date, String, String)
     */
    public static boolean isBefore(String dateBefore, String dateAfter, String datePattern) {
        Date before = string2Date(dateBefore, datePattern);
        return isBefore(before, dateAfter, datePattern);
    }

    /**
     * ??,?Date, date_before ?date_after<br>
     * :
     * 
     * <pre>
     * isBefore("2011-05-01","2011-04-01",DateUtil.pattern_onlyDate)
     * return true
     * </pre>
     * 
     * @param before
     *            before
     * @param dateAfter
     *            dateAfter
     * @param datePattern
     *            pattern {@link DatePattern}
     * @return before  dateAfter true
     * @see #string2Date(String, String)
     * @see #isBefore(String, String, String)
     * @see Date#before(Date)
     */
    public static boolean isBefore(Date before, String dateAfter, String datePattern) {
        Date after = string2Date(dateAfter, datePattern);
        return isBefore(before, after);
    }

    /**
     * Checks if is before.
     *
     * @param before
     *            the before
     * @param when
     *            the after
     * @return true, if checks if is before
     * @see java.util.Date#before(Date)
     * @since 1.2.2
     */
    public static boolean isBefore(Date before, Date when) {
        return before.before(when);
    }

    /**
     * Checks if is after.
     *
     * @param after
     *            the after
     * @param when
     *            the when
     * @return true, if checks if is after
     * @since 1.2.2
     */
    public static boolean isAfter(Date after, Date when) {
        return after.after(when);
    }

    // [end]

    // [start]isInTime 

    /**
     * ??.
     * 
     * <pre>
     *  :2012-10-16 23:00:02
     * 
     * isInTime(date, "2012-10-10 22:59:00", "2012-10-18 22:59:00", DatePattern.commonWithTime)
     * 
     * return true
     * </pre>
     * 
     * @param date
     *            ?
     * @param beginTime
     *            
     * @param endTime
     *            ?
     * @param datePattern
     *            ??{@link DatePattern}
     * @return {@code  date after beginTimeDate&&?before endTimeDate,true}
     * @see #string2Date(String, String)
     * @see #isInTime(Date, Date, Date)
     */
    public static boolean isInTime(Date date, String beginTime, String endTime, String datePattern) {
        Date beginTimeDate = string2Date(beginTime, datePattern);
        Date endTimeDate = string2Date(endTime, datePattern);
        return isInTime(date, beginTimeDate, endTimeDate);
    }

    /**
     * ??.
     * 
     * <pre>
     *  :2012-10-16 23:00:02
     * 
     * isInTime(date, "2012-10-10 22:59:00", "2012-10-18 22:59:00")
     * 
     * return true
     * </pre>
     * 
     * @param date
     *            ?
     * @param beginTimeDate
     *            the begin time date
     * @param endTimeDate
     *            the end time date
     * @return {@code  date after beginTimeDate&&?before endTimeDate,true}
     * @see Date#after(Date)
     * @see Date#before(Date)
     */
    public static boolean isInTime(Date date, Date beginTimeDate, Date endTimeDate) {
        return date.after(beginTimeDate) && date.before(endTimeDate);
    }

    // [end]

    // [start]isEquals
    /**
     * ??,?.
     * 
     * @param date1
     *            1
     * @param date2
     *            2
     * @param datePattern
     *            ? {@link DatePattern}
     * @return true,?false
     * @see #date2String(Date, String)
     * @since 1.0.5 change name from isEqual to isEquals
     */
    public static boolean isEquals(Date date1, Date date2, String datePattern) {
        return date2String(date1, datePattern).equals(date2String(date2, datePattern));
    }

    // [end]

    // [start]isLeapYear 

    /**
     * ?? .
     * 
     * <p>
     * : {@code (year % 4 == 0 && year % 100 != 0) || year % 400 == 0}
     * </p>
     * 
     * <h3>:</h3>
     * 
     * <blockquote>
     * 
     * <p>
     * ??3655?4846?365.24219?tropical year.<br>
     * ?365,0.2422,,21,366,.<br>
     * </p>
     * 
     * <p>
     * ?40097.?,???0.0078,?3?,<br>
     * ,???.
     * </p>
     * 
     * <p>
     * ,,400??,?400?,100?,,<br>
     * ,?,?.<br>
     * 
     * ,2000,1900.<br>
     * </p>
     * </blockquote>
     * 
     * @param year
     *            
     * @return ,?,?
     * @see GregorianCalendar#isLeapYear(int)
     */
    public static boolean isLeapYear(int year) {
        return new GregorianCalendar().isLeapYear(year);
    }

    // [end]
}