java日期时间操作类

来源:互联网 发布:linux系统启动级别 编辑:程序博客网 时间:2024/04/29 00:11
package com.netcode.date; import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.GregorianCalendar;import java.util.TimeZone;/*** 日期类型与字符串类型相互转换*/public class DateUtil{    /**     * Base ISO 8601 Date format yyyyMMdd i.e., 20021225 for the 25th day of December in the year 2002     */    public static final String ISO_DATE_FORMAT = "yyyyMMdd";    /**     * Expanded ISO 8601 Date format yyyy-MM-dd i.e., 2002-12-25 for the 25th day of December in the year 2002     */    public static final String ISO_EXPANDED_DATE_FORMAT = "yyyy-MM-dd";    /**     * yyyy-MM-dd hh:mm:ss     */    public static String DATETIME_PATTERN = "yyyy-MM-dd hh:mm:ss";    /**     * Default lenient setting for getDate.     */    private static boolean LENIENT_DATE = false;    /**     * 暂时不用     * @param JD     * @return     */    protected static final float normalizedJulian(float JD)    {        float f = Math.round(JD + 0.5f) - 0.5f;        return f;    }    /**     * 浮点值转换成日期格式<br>     * 暂时不用     * Returns the Date from a julian. The Julian date will be converted to noon GMT,     * such that it matches the nearest half-integer (i.e., a julian date of 1.4 gets     * changed to 1.5, and 0.9 gets changed to 0.5.)     *     * @param JD the Julian date     * @return the Gregorian date     */    public static final Date toDate(float JD)    {        /* To convert a Julian Day Number to a Gregorian date, assume that it is for 0 hours, Greenwich time (so         * that it ends in 0.5). Do the following calculations, again dropping the fractional part of all         * multiplicatons and divisions. Note: This method will not give dates accurately on the         * Gregorian Proleptic Calendar, i.e., the calendar you get by extending the Gregorian         * calendar backwards to years earlier than 1582. using the Gregorian leap year         * rules. In particular, the method fails if Y<400. */        float Z = (normalizedJulian(JD)) + 0.5f;        float W = (int) ( (Z - 1867216.25f) / 36524.25f);        float X = (int) (W / 4f);        float A = Z + 1 + W - X;        float B = A + 1524;        float C = (int) ( (B - 122.1) / 365.25);        float D = (int) (365.25f * C);        float E = (int) ( (B - D) / 30.6001);        float F = (int) (30.6001f * E);        int day = (int) (B - D - F);        int month = (int) (E - 1);        if (month > 12)        {            month = month - 12;        }        int year = (int) (C - 4715); //(if Month is January or February) or C-4716 (otherwise)        if (month > 2)        {            year--;        }        Calendar c = Calendar.getInstance();        c.set(Calendar.YEAR, year);        c.set(Calendar.MONTH, month - 1); // damn 0 offsets        c.set(Calendar.DATE, day);        return c.getTime();    }    /**     * Returns the days between two dates. Positive values indicate that     * the second date is after the first, and negative values indicate, well,     * the opposite. Relying on specific times is problematic.     *     * @param early the "first date"     * @param late the "second date"     * @return the days between the two dates     */    public static final int daysBetween(Date early, Date late)    {        Calendar c1 = Calendar.getInstance();        Calendar c2 = Calendar.getInstance();        c1.setTime(early);        c2.setTime(late);        return daysBetween(c1, c2);    }    /**     * Returns the days between two dates. Positive values indicate that     * the second date is after the first, and negative values indicate, well,     * the opposite.     *     * @param early     * @param late     * @return the days between two dates.     */    public static final int daysBetween(Calendar early, Calendar late)    {        return (int) (toJulian(late) - toJulian(early));    }    /**     * Return a Julian date based on the input parameter. This is     * based from calculations found at     * <a href="http://quasar.as.utexas.edu/BillInfo/JulianDatesG.html">Julian Day Calculations     * (Gregorian Calendar)</a>, provided by Bill Jeffrys.     * @param c a calendar instance     * @return the julian day number     */    public static final float toJulian(Calendar c)    {        int Y = c.get(Calendar.YEAR);        int M = c.get(Calendar.MONTH);        int D = c.get(Calendar.DATE);        int A = Y / 100;        int B = A / 4;        int C = 2 - A + B;        float E = (int) (365.25f * (Y + 4716));        float F = (int) (30.6001f * (M + 1));        float JD = C + D + E + F - 1524.5f;        return JD;    }    /**     * 暂时不用     * Return a Julian date based on the input parameter. This is     * based from calculations found at     * <a href="http://quasar.as.utexas.edu/BillInfo/JulianDatesG.html">Julian Day Calculations     * (Gregorian Calendar)</a>, provided by Bill Jeffrys.     * @param date     * @return the julian day number     */    public static final float toJulian(Date date)    {        Calendar c = Calendar.getInstance();        c.setTime(date);        return toJulian(c);    }    /**     * 日期增加     * @param isoString 日期字符串     * @param fmt 格式     * @param field 年/月/日 Calendar.YEAR/Calendar.MONTH/Calendar.DATE     * @param amount 增加数量     * @return     * @throws ParseException     */    public static final String dateIncrease(String isoString, String fmt, int field, int amount)    {        try        {            Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone(                "GMT"));            cal.setTime(stringToDate(isoString, fmt, true));            cal.add(field, amount);            return dateToString(cal.getTime(), fmt);        }        catch (Exception ex)        {            return null;        }    }    /**     * Time Field Rolling function.     * Rolls (up/down) a single unit of time on the given time field.     *     * @param isoString     * @param field the time field.     * @param up Indicates if rolling up or rolling down the field value.     * @param expanded use formating char's     * @exception ParseException if an unknown field value is given.     */    public static final String roll(String isoString, String fmt, int field, boolean up)        throws ParseException    {        Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone(            "GMT"));        cal.setTime(stringToDate(isoString, fmt));        cal.roll(field, up);        return dateToString(cal.getTime(), fmt);    }    /**     * Time Field Rolling function.     * Rolls (up/down) a single unit of time on the given time field.     *     * @param isoString     * @param field the time field.     * @param up Indicates if rolling up or rolling down the field value.     * @exception ParseException if an unknown field value is given.     */    public static final String roll(String isoString, int field, boolean up)        throws ParseException    {        return roll(isoString, DATETIME_PATTERN, field, up);    }    /**     * 字符串转换为日期java.util.Date     * @param dateText 字符串     * @param format 日期格式     * @param lenient 日期越界标志     * @return     */    public static Date stringToDate(String dateText, String format, boolean lenient)    {        if (dateText == null)        {            return null;        }        DateFormat df = null;        try        {            if (format == null)            {                df = new SimpleDateFormat();            }            else            {                df = new SimpleDateFormat(format);            }            // setLenient avoids allowing dates like 9/32/2001            // which would otherwise parse to 10/2/2001            df.setLenient(false);            return df.parse(dateText);        }        catch (ParseException e)        {            return null;        }    }    /**     * 字符串转换为日期java.util.Date     * @param dateText 字符串     * @param format 日期格式     * @return     */    public static Date stringToDate(String dateString, String format)    {        return stringToDate(dateString, format, LENIENT_DATE);    }    /**     * 字符串转换为日期java.util.Date     * @param dateText 字符串     */    public static Date stringToDate(String dateString)    {        return stringToDate(dateString, ISO_EXPANDED_DATE_FORMAT, LENIENT_DATE);    }    /** 根据时间变量返回时间字符串     * @return 返回时间字符串     * @param pattern 时间字符串样式     * @param date 时间变量     */    public static String dateToString(Date date, String pattern)    {        if (date == null)        {            return null;        }        try        {            SimpleDateFormat sfDate = new SimpleDateFormat(pattern);            sfDate.setLenient(false);            return sfDate.format(date);        }        catch (Exception e)        {            return null;        }    }    /**     * 根据时间变量返回时间字符串 yyyy-MM-dd     * @param date     * @return     */    public static String dateToString(Date date)    {        return dateToString(date, ISO_EXPANDED_DATE_FORMAT);    }    /** 返回当前时间     * @return 返回当前时间     */    public static Date getCurrentDateTime()    {        java.util.Calendar calNow = java.util.Calendar.getInstance();        java.util.Date dtNow = calNow.getTime();        return dtNow;    }    /**     * 返回当前日期字符串     * @param pattern 日期字符串样式     * @return     */    public static String getCurrentDateString(String pattern)    {        return dateToString(getCurrentDateTime(), pattern);    }    /**     * 返回当前日期字符串 yyyy-MM-dd     * @return     */    public static String getCurrentDateString()    {        return dateToString(getCurrentDateTime(), ISO_EXPANDED_DATE_FORMAT);    }    /**     * 返回当前日期+时间字符串 yyyy-MM-dd hh:mm:ss     * @param date     * @return     */    public static String dateToStringWithTime(Date date)    {        return dateToString(date, DATETIME_PATTERN);    }    /**     * 日期增加-按日增加     * @param date     * @param days     * @return java.util.Date     */    public static Date dateIncreaseByDay(Date date, int days)    {        Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone(            "GMT"));        cal.setTime(date);        cal.add(Calendar.DATE, days);        return cal.getTime();    }    /**     * 日期增加-按月增加     * @param date     * @param days     * @return java.util.Date     */    public static Date dateIncreaseByMonth(Date date, int mnt)    {        Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone(            "GMT"));        cal.setTime(date);        cal.add(Calendar.MONTH, mnt);        return cal.getTime();    }    /**     * 日期增加-按年增加     * @param date     * @param mnt     * @return java.util.Date     */    public static Date dateIncreaseByYear(Date date, int mnt)    {        Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone(            "GMT"));        cal.setTime(date);        cal.add(Calendar.YEAR, mnt);        return cal.getTime();    }    /**     * 日期增加     * @param date 日期字符串 yyyy-MM-dd     * @param days     * @return 日期字符串 yyyy-MM-dd     */    public static String dateIncreaseByDay(String date, int days)    {        return dateIncreaseByDay(date, ISO_DATE_FORMAT, days);    }    /**     * 日期增加     * @param date 日期字符串     * @param fmt 日期格式     * @param days     * @return     */    public static String dateIncreaseByDay(String date, String fmt, int days)    {        return dateIncrease(date, fmt, Calendar.DATE, days);    }    /**     * 日期字符串格式转换     * @param src 日期字符串     * @param srcfmt 源日期格式     * @param desfmt 目标日期格式     * @return     */    public static String stringToString(String src, String srcfmt, String desfmt)    {        return dateToString(stringToDate(src, srcfmt), desfmt);    }}   
原创粉丝点击