java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和联系

参考:链接

在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

**/
时间: 2024-10-01 05:05:11

java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和联系的相关文章

java.util.concurrent.locks.Lock类的lock和lockInterruptibly方法的区别

什么是可中断的锁获取呢?就是:线程在等待获取锁的过程中,是否能够响应中断,以便在被中断的时候能够解除阻 塞状态,而不是傻傻地一直在等待.java对象的内置锁(synchronized)就是一种不可中断的锁,也就是说如果一个线 程在等待获取某个对象的内置锁,就算是该线程被其他线程中断,该线程仍然继续等待内置锁,而不是解除阻塞状 态,也不会抛出InterruptedException.Lock类的lock()类似synchronized,是不可中断的,在等待获取锁的过程中, 不响应中断请求:lock

java.sql.Date和java.util.Date的不同和相互转换方式

一:前言 这是我在新的公司写的第一份博客吧,来了又一个星期了吧,但是在来的那几天我真的很迷茫的感觉这里是很不适合我的样子,而且我又是来实习的,我很不愿意啊,自己做的又是java web,最原始的servlet,代码和混乱,这让我很无奈啊,所以我在星期一的时候开始提出辞职,然后老大找我谈了谈,说这个项目是我们外包给别人的,我们只是在他们没空的时候改一改罢了,这样说至少让我感觉到还可以接受,最后我又提了下我自己不想实习,提高工资的事情也通过了,公司的干事效率还是很高的啊.虽然做的是servlet,但

java.util.Calendar简介

java.util.Calendar简介 一般写为:import java.util.Calendar;在开头 然后在中间写上, Calendar cal = Calendar.getInstance(); int year=cal.get(Calendar.YEAR); int month=cal.get(Calendar.MONTH);就可以了: Calendar是一个抽象类,我们无法直接实例化它,它有一个具体子类实体类java.util.GregorianCalendar,这个类实现的就是

【java】java自带的java.util.logging.Logger日志功能

偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下. 1.Java自带的日志功能,默认的配置 ①Logger的默认配置,位置在JRE安装目录下lib中的logging.properties中 ②logging.properties日志文件内容如下: ############################################################ # Default Logging Configuration File # # You

java----数据结构与算法----集合元素的遍历:迭代器-------->JavaAPI:java.util.Iterator+java.util.ListIterator

概述: 迭代器用于集合元素的遍历 迭代器有两种,分别是Iterator和ListIterator Iterator可以用于任何类型集合的遍历 ListIterator只能用于List集合的遍历 ListIterator接口继承了Iterator接口,所以前者拥有后者所定义的所有成员函数,同时,ListIterator还添加了一些具有List集合特性的操作函数,如按照索引访问集合元素.替换/添加集合元素等等 java.util.Iterator /** * @author chen * @date

java util包概述

util是utiliy的缩写,意为多用途的,工具性质的包这个包中主要存放了:集合类(如ArrayList,HashMap等),随机数产生类,属性文件读取类,定时器类等类.这些类极大方便了Java编程,日常java编程中,经常要用到这些类. 介绍 Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结构.例如,Java提供日期(Data)类.日历 (Calendar)类来产生和获取日期及时间,提供随机数(Random)类产生各种类型的随机数,还提供了堆栈(St

有关java.util.ConcurrentModificationException

有关java.util.ConcurrentModificationException java doc对这个类的定义: This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible. For example, it is not generally permissible for o

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException

异常情况: Tomcat启动时异常:java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException 异常内容: java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[

java.util.concurrent BlockingQueue

BlockingQueue 它实现了Queue接口.它是A BlockingQueue with one thread putting into it, and another thread taking from it. 一端生产一端消费. 其中的一个线程将不断的将任务放入BlockingQueue,直到遇到它的临界值,但是不允许插入NULL,否则会抛出NullPointerException.另一个线程从中不断的取任务. BlockingQueue 的方法 BlockingQueue 具有