参考:链接
在Web开发中,避免不了对日期的操作,常用的关于时间的类有这么几个:
java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp,这几个类在JDK的定义如下所示:
java.lang.Object
….|__java.util.Date
……….|__java.sql.Date/java.sql.Timestamp/java.sql.Time
….|__java.security.Timestamp
java.util.Date日期格式为:年月日时分秒
java.sql.Date日期格式为:年月日[只存储日期数据不存储时间数据,是专门针对sql设计]
java.sql.Time日期格式为:时分秒
java.sql.Timestamp日期格式为:年月日时分秒纳秒(毫微秒)
这些类的关系如下所示:
java.util.Date这个类是java.sql.Date, java.sql.Time, java.sql.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.Date类有getTime方法返回毫秒数,所以它可以与java.util.Date进行互换:
java.sql.Date转为java.util.Date
java.sql.Date sqlDate=new java.sql.Date();
java.util.Date utilDate=new java.util.Date (sqlDate.getTime());
java.util.Date转为java.sql.Date
java.util.Date utilDate=new Date();
java.sql.Date sqlDate=new java.sql.Date(utilDate.getTime());
java.sql.Time类屏蔽了java.util.Date的日期有关的字段(形如:yyyy-MM-dd),因此,不能通过这个类访问日期有关的信息,比如:如果你通过sqlTime.getYear()方法去获取年有关的信息,此方法会抛出一个IllegalArgumentException异常。这是因为java.sql.Time在继承java.util.Date类的时候对父类进行了重写,禁用了日期访问的方法。之所以这么处理,是为了和数据库的Time数据类型相匹配,数据库的Time数据类行只是保存时间有关的字段。
java.sql.date 是只包含了日期。而 java.sql.time 只包含了一个时间。java.sql.time java.sql.date 二者如何组合成一个java.util.date呢?取毫秒相加,作为java.util.date的构造方法参数就可以了。
java.sql.Date d = new java.sql.Date(new java.util.Date().getTime());
java.sql.Time t = new java.sql.Time(new java.util.Date().getTime());
java.util.Date day = new java.util.Date(d.getTime() + t.getTime());
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,并把它返回给用户使用。
Java中之间转换
package demo;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestData {
public static void main(String[] args) throws ParseException {
Date d = new Date(new Date().getTime());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowday1 = "2015-5-12 10:30:12";
String nowday2 = "2015-05-12 10:30:12";
Timestamp tt = new Timestamp(System.currentTimeMillis());
System.out.println(sdf.format(d));//Date -> String
System.out.println(sdf.parse(nowday1)); // String -> Date
System.out.println(sdf.format(tt)); // Timestamp -> String
System.out.println(tt.valueOf(nowday2));//String -> Timestamp :String的类型必须形如: yyyy-mm-dd hh:mm:ss[.f...] 这样的格式,中括号表示可选,否则报错
System.out.println(d=tt); // Timestamp -> Date 因为是父类直接向上转型
System.out.println(new Timestamp(d.getTime())); // Date ->Timestamp
}
}
/*
* oracle中Date与Timestamp转换
* SELECT TO_TIMESTAMP(TO_CHAR(SYSDATE, ‘YYYY-MM-DD HH24:MI:SS‘), ‘YYYY-MM-DD HH24:MI:SS‘) FROM dual;
* SELECT TO_DATE(TO_CHAR(TO_TIMESTAMP(TO_CHAR(SYSDATE, ‘YYYY-MM-DD HH24:MI:SS‘), ‘YYYY-MM-DD HH24:MI:SS‘),‘YYYY-MM-DD HH24:MI:SS‘),‘YYYY-MM-DD HH24:MI:SS‘) FROM dual;
*
*
*/
/**
2015-05-12 10:44:15
Tue May 12 10:30:12 CST 2015
2015-05-12 10:44:15
2015-05-12 10:30:12.0
2015-05-12 10:44:15.108
2015-05-12 10:44:15.108
**/