无情 @ 2015-04-17 10:13:37 阅读(1812)
Date java


在web开发中,避免不了对日期的操作,就几种常见的日期操作做个总结(部分参考网络,在此表示感谢):

java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp

 

java.lang.Object 
....|__java.util.Date 
..........|__java.sql.Date/java.sql.Timestamp /java.sql.Time

....|__java.security.Timestamp

 

java.util.Date日期格式为:年月日时分秒 
java.sql.Date日期格式为:年月日[只存储日期数据不存储时间数据] 
java.sql.Time日期格式为:时分秒 
java.sql.Timestamp日期格式为:年月日时分秒纳秒(毫微秒)

关系:

    java.util.Date这个类是java.sql.Date,  java.sql.Time,  java.slq.Timestamp这三个类的父类。这三个类对java.util.Date类进行了包装。

联系:

    java.sql.Date类屏蔽了java.util.Date类的时间有关的方法(形如:hh:mm:ss),因此,不可以通过这个类访问时间有关的信息,比如,如果你通过sqlDate.getHour()方法去访问小时信息,此方法会抛出一个IllegalArgumentException异常。这是因为java.sql.Date在继承java.util.Date类的时候对父类进行了重写,禁用了时间访问的方法。之所以这么处理,是为了和数据库的Date数据类型相匹配,数据库的Date数据类行只是保存日期有关的字段。

    Java.sql.Time类屏蔽了java.util.Date的日期有关的字段(形如:yyyy-MM-dd),因此,不能通过这个类访问日期有关的信息,比如:如果你通过sqlTime.getYear()方法去获取年有关的信息,此方法会抛出一个IllegalArgumentException异常。这是因为java.sql.Time在继承java.util.Date类的时候对父类进行了重写,禁用了日期访问的方法。之所以这么处理,是为了和数据库的Time数据类型相匹配,数据库的Time数据类行只是保存时间有关的字段。

  Java.sql.Timestamp字段则对java.util.Date这个类进行了扩充,它在java.util.Date类的基础上增加了毫秒的时间访问控制,因此,你可以通过getNanos()方法去获取时间的毫微秒数(注意此处获取的时间是以毫微秒为单位的,1秒等于十亿毫微秒),同样的,这也是为了和数据库中的Timestamp数据类型进行匹配。

理清了上述四个类的关系,那么java.util.Date和java.util.Calendar类有什么关系呢?

   Java.util.Calendar类是java.util.Date类的一个更加深入,更加全面的替代。Java.util.Calendar类支持java.util.Date的所有功能,此外,Calendar还引入了多语言,多区域的特性,可以根据需要获取不同区域,不同时区的时间,Calendar还增加了比Date更加方便和快捷的许多操作,如获取一年当中的第几个星期,各个月的天数等便捷的方法。

 

注意:

Java.util.Calendar区别与java.util.Date的几个地方也需要注意一下:首先,Calendar增加了毫秒的时间段,通过它可以获取时间点的毫秒值,而java.util.Date只是精确到秒。其次,Calendar过去年的时候是当前年份比如:2010,而Date获取年份的时获取到的是当前年份-1900的一个值(2010-1900=110,因此,你调用getYear后过去的值就是110)。最后Calendar是一个抽象类,之所以能够实例化,是因为此处的Calendar充当了一个类似于工厂的作用,在getInstance方法中实例化了Calendar子类GregorianCalendar,并把它返回给用户使用。


针对不同的数据库选用不同的日期类型 
·Oracle的Date类型,只需要年月日,选择使用java.sql.Date类型 
·MS Sqlserver数据库的DateTime类型,需要年月日时分秒,选择java.sql.Timestamp类型


另外给出一个java时间公共类


import java.io.File;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * @author zhuhuipei
 */
public class DateUtil {

    public static final String formatStr1 = "yyyy-MM-dd HH:mm:ss";
    public static final String formatStr2 = "yyyy-MM-dd";
    public static final String formatStr3 = "yyyyMMdd";
    public static final String formatStr4 = "yyyy-MM";
    public static final String formatStr5 = "yyyyMMddHHmmss";
    public static final String formatStr6 = "yyyy-MM-dd HH:mm:ss.S";

    public static final String getDateTimeDir(Date date) {
        return DateUtil.getDateFormat(date, "yyyy") + File.separator + DateUtil.getDateFormat(date, "MM")
               + File.separator + DateUtil.getDateFormat(date, "dd");
    }

    /**
     * 返回日期字符串:"yyyy-MM-dd HH:mm:ss" 格式。
     * 
     * @param date
     * @return
     */
    public static final String getDateTime(Date date) {
        if (date == null) return "";
        DateFormat ymdhmsFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return ymdhmsFormat.format(date);
    }

    /**
     * 两个时间之间相差距离多少天
     * 
     * @param one 时间参数 1:
     * @param two 时间参数 2:
     * @return 相差天数
     */
    public static long getDistanceDays(String str1, String str2) throws Exception {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date one;
        Date two;
        long days = 0;
        try {
            one = df.parse(str1);
            two = df.parse(str2);
            long time1 = one.getTime();
            long time2 = two.getTime();
            long diff;
            if (time1 < time2) {
                diff = time2 - time1;
            } else {
                diff = time1 - time2;
            }
            days = diff / (1000 * 60 * 60 * 24);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return days;
    }

    /**
     * 距离今天相差多少天
     * 
     * @2012-7-26
     * @author zhuhuipei
     * @param str
     * @return
     * @throws Exception
     */
    public static long getDistanceDaysTONow(String str) throws Exception {
        Date now = new Date();
        String nowstr = getDateFormat(now, formatStr2);
        return getDistanceDays(str, nowstr);
    }

    public static final String getDateDay(Date date) {
        if (date == null) {
            return "";
        }
        DateFormat ymdhmsFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return ymdhmsFormat.format(date);
    }

    /**
     * 根据指定的格式,返回指定日期的对应格式
     * 
     * @param date
     * @param formatStr 可以是"yyyy-MM-dd HH:mm:ss","yyyy-MM-dd HH:mm","yyyy-MM-dd HH","yyyy-MM-dd"等等
     * @return
     */
    public static String getDateFormat(Date date, String formatStr) {
        if (date == null || formatStr == null) return "";
        DateFormat ymdFormat = new SimpleDateFormat(formatStr);
        String tmpStr = ymdFormat.format(date).toString();
        if (tmpStr == null) return "";
        return tmpStr;
    }

    /**
     * 时间比较
     * 
     * @param args
     * @throws ParseException
     */

    public static boolean isDateBefore(String date1, String date2) {
        try {
            DateFormat df = DateFormat.getDateTimeInstance();
            return df.parse(date1).before(df.parse(date2));
        } catch (ParseException e) {
            System.out.print("[SYS] " + e.getMessage());
            return false;
        }
    }

    /**
     * 字符传化成时间类型
     * 
     * @2012-7-19
     * @author zhuhuipei
     * @param ds
     * @return
     * @throws ParseException
     */
    public static Date strintToDatetime(String ds) throws ParseException {
        if (ds == null) {
            return null;
        }
        SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d = sdf.parse(ds);
        return d;
    }

    /**
     * 字符传化成时间类型
     * 
     * @2012-7-19
     * @author zhuhuipei
     * @param ds
     * @return
     * @throws ParseException
     */
    public static Date strintToDatetime(String ds, String DateFormat) throws ParseException {
        if (ds == null) {
            return null;
        }
        SimpleDateFormat sdf = new java.text.SimpleDateFormat(DateFormat);
        Date d = sdf.parse(ds);
        return d;
    }

    /**
     * 时间向前推
     * 
     * @param days
     * @return
     */
    public static String getDateAgo(int days) {
        SimpleDateFormat sd = new SimpleDateFormat(DateUtil.formatStr2);
        Calendar calendar = Calendar.getInstance();
        int i = calendar.get(Calendar.DAY_OF_YEAR);
        i = i - days;
        calendar.set(Calendar.DAY_OF_YEAR, i);
        return sd.format(calendar.getTime());
    }

    /**
     * 时间向前推
     * 
     * @param days
     * @return
     */
    public static Date getDateAgoDate(int days, String format) {
        SimpleDateFormat sd = new SimpleDateFormat(format);
        Calendar calendar = Calendar.getInstance();
        int i = calendar.get(Calendar.DAY_OF_YEAR);
        i = i - days;
        calendar.set(Calendar.DAY_OF_YEAR, i);
        Date date = null;
        try {
            date = strintToDatetime(sd.format(calendar.getTime()), format);
            return date;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * 时间向前推
     * 
     * @param days
     * @return
     */
    public static String getDateAgo(int days, String format) {
        SimpleDateFormat sd = new SimpleDateFormat(format);
        Calendar calendar = Calendar.getInstance();
        int i = calendar.get(Calendar.DAY_OF_YEAR);
        i = i - days;
        calendar.set(Calendar.DAY_OF_YEAR, i);
        return sd.format(calendar.getTime());
    }

    /**
     * 时间推移
     * 
     * @param days
     * @return
     */
    public static String getHourLater(int hour, String format) {
        SimpleDateFormat sd = new SimpleDateFormat(format);
        Calendar cal = Calendar.getInstance();
        cal.add(java.util.Calendar.HOUR_OF_DAY, hour);
        return sd.format(cal.getTime());
    }

    /**
     * 时间推移
     * 
     * @param days
     * @return
     */
    public static Date getHourLaterDate(int hour) {
        Calendar cal = Calendar.getInstance();
        cal.add(java.util.Calendar.HOUR_OF_DAY, hour);
        return cal.getTime();
    }

    /**
     * 获取当前周 周一日期 按周一至周日 是一个周期计算。 例如:2013-11-18至2013-11-24
     * 
     * @autor lijn 2013-11-22
     * @return
     */
    public static Date getMonDayCurrentWeek() {
        Calendar cal = Calendar.getInstance();
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        return cal.getTime();
    }

    public static Date getMonDayLastWeek() {
        return addToDay(getMonDayCurrentWeek(), -7);
    }

    /**
     * 获取当前周 周日日期 按周一至周日 是一个周期计算。例如:2013-11-18至2013-11-24
     * 
     * @autor lijn 2013-11-22
     * @return
     */
    public static Date getSunDayCurrentWeek() {
        Calendar cal = Calendar.getInstance();
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        cal.add(Calendar.DAY_OF_MONTH, 6);
        return cal.getTime();
    }

    public static Date getSunDayLastWeek() {
        return addToDay(getSunDayCurrentWeek(), -7);
    }

    /**
     * 获得当前日期 + N个天 之后的日期
     * 
     * @autor lijn 2013-11-22
     * @param oldDate
     * @param n
     * @return
     */
    public static Date addToDay(Date oldDate, int n) {
        Date newDate = null;
        Calendar calOld = Calendar.getInstance();
        calOld.setTime(oldDate);
        int day = calOld.get(Calendar.DAY_OF_MONTH);
        Calendar calNew = Calendar.getInstance();
        calNew.setTime(oldDate);
        calNew.set(Calendar.DAY_OF_MONTH, n + day);
        newDate = calNew.getTime();
        return newDate;
    }

    /**
     * 计算两个日期之间相差的天数
     * 
     * @autor lijn 2013-11-25
     * @param date1 较小的时间
     * @param date2 较大的时间
     * @return 相差天数
     */
    public static int getBetweenDays(Date date1, Date date2) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            date1 = sdf.parse(sdf.format(date1));
            date2 = sdf.parse(sdf.format(date2));
        } catch (java.text.ParseException e) {
            e.printStackTrace();
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(date1);
        long time1 = cal.getTimeInMillis();
        cal.setTime(date2);
        long time2 = cal.getTimeInMillis();

        long between_days = (time2 - time1) / (1000 * 3600 * 24);

        return new BigDecimal(String.valueOf(between_days)).abs().intValue();
    }

    /**
     * 计算日期间相差的秒数
     * 
     * @author shihl 2014-3-5
     * @param startDate 起始时间
     * @param endDate 结束时间
     * @return
     */
    public static int getBetweenSeconds(Date startDate, Date endDate) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(startDate);
        long startTime = cal.getTimeInMillis();
        cal.setTime(endDate);
        long endTime = cal.getTimeInMillis();

        long betweenMillionSeconds = endTime - startTime;

        int betweenSeconds = BigDecimal.valueOf(betweenMillionSeconds).divide(new BigDecimal(1000),
                                                                              BigDecimal.ROUND_HALF_DOWN).intValue();

        return betweenSeconds;
    }

    /**
     * 获取当前系统时间
     * 
     * @author wangxm 2013年11月4日
     * @return
     */
    public static Date getSystemDate() {
        Date curDate = new Date(System.currentTimeMillis());// 获取当前时间
        return curDate;
    }

    /**
     * 查询上周周一
     * 
     * @author wangxm 2013年11月21日
     * @return
     */
    public static Date getMondayOfLastWeek() {
        Calendar c = Calendar.getInstance();
        int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1;
        if (day_of_week == 0) day_of_week = 7;
        c.add(Calendar.DATE, -day_of_week + 1 - 7);
        return c.getTime();
    }

    /**
     * 查询上周周日
     * 
     * @author wangxm 2013年11月21日
     * @return
     */
    public static Date getSundayOfLastWeek() {
        Calendar c = Calendar.getInstance();
        int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1;
        if (day_of_week == 0) day_of_week = 7;
        c.add(Calendar.DATE, -day_of_week);
        return c.getTime();
    }

    /**
     * 时间比较
     * 
     * @author wangxm 2013年11月4日
     * @param date1
     * @param date2
     * @return
     */
    public static boolean isDateBefore(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            return false;
        }
        return date1.before(date2);
    }

    /**
     * 两个时间之间相差距离多少天
     * 
     * @author wangxm 2013年11月4日
     * @param date1
     * @param date2
     * @return
     */
    public static long getDistanceDays(Date date1, Date date2) {
        long days = 0;
        long time1 = date1.getTime();
        long time2 = date2.getTime();
        long diff;
        if (time1 < time2) {
            diff = time2 - time1;
        } else {
            diff = time1 - time2;
        }
        days = diff / (1000 * 60 * 60 * 24);
        return days;
    }

    /**
     * 两个时间之间相差距离多少分钟
     * 
     * @author wangxm 2013年11月4日
     * @param date1
     * @param date2
     * @return
     */
    public static long getDistanceMinutes(Date date1, Date date2) {
        long days = 0;
        long time1 = date1.getTime();
        long time2 = date2.getTime();
        long diff;
        if (time1 < time2) {
            diff = time2 - time1;
        } else {
            diff = time1 - time2;
        }
        days = diff / (1000 * 60);
        return days;
    }

    /**
     * 格式化date。
     * 
     * @param date
     * @return
     */
    public static final String formatDate(Date date, String format) {
        if (date == null) return "";
        DateFormat ymdhmsFormat = new SimpleDateFormat(format);
        return ymdhmsFormat.format(date);
    }

    public static final Date getFirstDayOfCurrentMonth() {
        Calendar c = Calendar.getInstance();
        c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.getActualMinimum(Calendar.DAY_OF_MONTH), 0, 0, 0);
        return c.getTime();
    }

    public static final Date getLastDayOfCurrentMonth() {
        Calendar c = Calendar.getInstance();
        c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.getActualMaximum(Calendar.DAY_OF_MONTH), 0, 0, 0);
        return c.getTime();
    }

    public static final Date getFirstDayOfLastMonth() {
        Calendar c = Calendar.getInstance();
        c.setTime(getFirstDayOfCurrentMonth());
        c.roll(Calendar.MONTH, -1);
        return c.getTime();
    }

    public static final Date getlastDayOfLastMonth() {
        Calendar c = Calendar.getInstance();
        c.setTime(getLastDayOfCurrentMonth());
        c.roll(Calendar.MONTH, -1);
        return c.getTime();
    }

    /**
     * 获取两个日期间隔的时间列表()
     * @param d1
     * @param d2
     * @return
     * @throws ParseException
     * 2014年4月30日
     * @author wangxm
     */
    public static List<String> getBetweenDate(String d1, String d2) throws ParseException {
        List<String> list = new ArrayList<String>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar gc1 = Calendar.getInstance();
        Calendar gc2 = Calendar.getInstance();
       
        if(!StringUtil.isEmpty(d2)){
            gc2.setTime(sdf.parse(d2));
        }else{
            gc1.setTime(addToDay(gc2.getTime(), -2));;
        }
        if(!StringUtil.isEmpty(d1)){
            gc1.setTime(sdf.parse(d1));
        }else{
            gc1.setTime(addToDay(gc2.getTime(), -32));;
        }
        do {
            Calendar gc3 = (Calendar) gc1.clone();
            list.add(sdf.format(gc3.getTime()));
            gc1.add(Calendar.DAY_OF_MONTH, 1);
        } while (!gc1.after(gc2));
        return list;
    }
    
    /**
     * 时间向后推
     * @author honghy
     * 2014-5-6
     * @param days
     * @param format
     * @return
     */
    public static String getDateAfter(int days,String format) {
        Date date=new Date();//取时间
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DATE,days);//把日期往后增加一天.整数往后推,负数往前移动
        
        date=calendar.getTime(); //这个时间就是日期往后推一天的结果        
        return getDateFormat(date, format);
    }
    
    /**
     * 时间在某个时间向后推
     * @author honghy
     * 2014-5-8
     * @param nowDate
     * @param days 正数向后推,负数向前推
     * @param format
     * @return
     */
    public static Date getDatePush(Date nowDate,int days,String format) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(nowDate);
        calendar.add(Calendar.DATE,days);//把日期往后增加一天.整数往后推,负数往前移动
        
        Date date=calendar.getTime(); //这个时间就是日期往后推一天的结果        
        String resultStr = getDateTime(date);
        try {
            return strintToDatetime(resultStr, format);
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }

    public static void main(String[] args) {
        System.out.println(getDatePush(new Date(), -7, formatStr2));
    }
}