zoukankan      html  css  js  c++  java
  • java.util.Date与java.sql.Date的关系和转换方法(转)

    在ResultSet中我们经常使用的setDate或getDate的数据类型是java.sql.Date,而在平时java程序中我们一般习惯使用 java.util.Date。

    因此在DAO层我们经常会碰到这俩种数据类型的相互转换。

    两者的关系
    java.lang.Object
    |
    +---java.util.Date
    |
    +----java.sql.Date 
    从这个图中我们可以知道java.sql.Date是从java.util.Date继承过来的。

    相互转换
    1. 使用getTime()函数
    这两个类都提供了getTime()函数,用于返回对应的毫秒数(long类型)。利用这个函数可以实现转换:
    java.util.Date utilDate = new java.util.Date(sqlDate.getTime()); // sql -> util
    java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); // util -> sql

    2. 使用SimpleDateFormat类实现转换
    SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类。 它允许格式化 (date -> text)、语法分析 (text -> date)和标准化。
    SimpleDateFormat dateFormat = new SimpleDateFormate("yyyy-MM-dd HH:mm:ss");
    java.util.Date utilDate = dateFormat.parse(sqlDate.toString());

    3. 直接转换
    由于java.sql.Date是从java.util.Date中继承过来的,所以可以直接用:
    utilDate = sqlDate;

    4. 另类获得日期的方法:
    SimpleDateFormat sy=new SimpleDateFormat("yyyy");
    SimpleDateFormat sm=new SimpleDateFormat("MM");
    SimpleDateFormat sd=new SimpleDateFormat("dd");
    String syear=sy.format(date);
    String smon=sm.format(date);
    String sday=sd.format(date);

    ps: java.util.Date类中的getYear()要加上1900才可得到实际值,getMonth()则要加上1

    java.util.Date和java.sql.Date的区别

    在除了SQL语句的情况下面使用java.sql.Date,它是针对SQL语句使用的,它只包含日期而没有时间部分。
    它都有getTime方法返回毫秒数,自然就可以直接构建
    java.util.Date d = new java.util.Date(sqlDate.getTime());


    java.util.Date 是 java.sql.Date 的父类(注意拼写)
    前者是常用的表示时间的类,我们通常格式化或者得到当前时间都是用他
    后者之后在读写数据库的时候用他,因为PreparedStament的setDate()的第2参数和ResultSet的getDate()方法的第2个参数都是java.sql.Date 
    转换是
    java.util.Date d=new java.util.Date (sqldate.getTime());
    反过来是一样的

    java.util.Date和java.sql.Date的异同
           java.sql.Date,java.sql.Time和java.sql.Timestamp三个都是java.util.Date的子类(包装类)。

           但是为什么java.sql.Date类型的值插入到数据库中Date字段中会发生数据截取呢?

           java.sql.Date是为了配合SQL DATE而设置的数据类型。“规范化”的java.sql.Date只包含年月日信息,时分秒毫秒都会清零。格式类似:YYYY-MM-DD。当我们调用ResultSet的getDate()方法来获得返回值时,java程序会参照"规范"的java.sql.Date来格式化数据库中的数值。因此,如果数据库中存在的非规范化部分的信息将会被劫取。

           在sun提供的ResultSet.java中这样对getDate进行注释的:
           Retrieves the of the designated column in the current row of this <code>ResultSet</code> object as a “java.sql.Date” object in the Java programming language.

            同理。如果我们把一个java.sql.Date值通过PrepareStatement的setDate方法存入数据库时,java程序会对传入的java.sql.Date规范化,非规范化的部分将会被劫取。然而,我们java.sql.Date一般由java.util.Date转换过来,如:java.sql.Date sqlDate=new java.sql.Date(new java.util.Date().getTime()).
    显然,这样转换过来的java.sql.Date往往不是一个规范的java.sql.Date.要保存java.util.Date的精确值,我们需要利用java.sql.Timestamp.

    java.sql.Time sTime=new java.sql.Time(utilDate.getTime());

    java.sql.Timestamp stp=new java.sql.Timestamp(utilDate.getTime());

    另外,插入数据库时的时间类型:


    datetime。对应于java中的Timestamp。内包含日期和时间。用new Timestamp(System.currentTimeMillis())来得到;

  • 相关阅读:
    C#模拟百度登录并到指定网站评论回帖(一)
    4张图看明白用户、权限和租户的关系
    我的微服务之路
    IT部门不应该是一个后勤部门
    一个值只有0和1的字段,到底要不要建索引?
    论程序员的自我修养
    RBAC权限管理系统数据模型
    有史以来功能最全,使用最简单的excel导入/导出工具
    一个完全平均分布的固定长度随机数发生器
    基于WCF的RESTFul WebAPI如何对传输内容实现压缩
  • 原文地址:https://www.cnblogs.com/zhangshitong/p/4974477.html
Copyright © 2011-2022 走看看