sql date转java date_[转]java.util.Date和java.sql.Date转换

Date 的类型转换:首先记住java.util.Date 为 java.sql.Date的父类

1.将java.util.Date 转换为 java.sql.Date

java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date

Date d=new Date();  //java.util.Date

new java.sql.Date(d.getTime())  //将java.util.Date 转换为 java.sql.Date

2.使用SimpleDateFormat 进行类型转换

DateFormat df=new SimpleDateFormat("yyyy-MM-dd");

df.format(new Date()); //将java.util.Date转换为String

df.parse("");  //将String 转为成java.util.Date

3. 将String 转换为 java.sql.Date

String str="1989-11-23 12:25:20";

java.sql.Date date=java.sql.Date.valueof(str);

关于如何向数据库中插入的时间,精确到时分秒的问题,下一篇文章中具体给出了做法

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

java.sql.Date是java.util.Date的子类,是一个包装了毫秒值的瘦包装器,允许 JDBC 将毫秒值标识为 SQL DATE 值。毫秒值表示自 1970 年 1 月 1 日 00:00:00 GMT 以来经过的毫秒数。 为了与 SQL DATE 的定义一致,由 java.sql.Date 实例包装的毫秒值必须通过将时间、分钟、秒和毫秒设置为与该实例相关的特定时区中的零来“规范化”。

说白了,java.sql.Date就是与数据库Date相对应的一个类型,而java.util.Date是纯java的Date。

从类 java.util.Date 继承的方法

after, before, clone, compareTo, equals, getDate, getDay, getMonth, getTime, getTimezoneOffset, getYear, hashCode, parse, setDate, setMonth, setYear, toGMTString, toLocaleString, UTC

sql.Date也有时间的

如果不想用oracle的to_date函数,可以自己生成sql.Date对象

String s = "2012-06-21 00:10:00";

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

java.util.Date d1 = sdf.parse(s); //先把字符串转为util.Date对象

java.sql.Date d2 = new java.sql.Date(d1.getTime()); //再转换为sql.Date对象

想要将带时分秒的时间插入到数据库中,除了Oracle数据库的to_date()方法之外。我们可以用 Timestamp类来实现。java.sql.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 ResultSet 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.

String s="2012-01-02 03:12:21";

SimpleDateFormat sp = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

java.util.Date du = sp.parse(s);

java.sql.Timestamp st = new java.sql.Timestamp(du.getTime());

把一个日期值写入数据库中,发现由java.util.Date转存为java.sql.Date后,只有年月日,没有了时分秒:

java.util.Date ud = new java.util.Date();

java.sql.Date sd = new java.sql.Date(ud.getTime());

这个可是不行的,用户至少要精确到分。由于java.sql.Date为了能够遵守sql日期标准,把所有时分秒都归了零。只有用Timestamp来进行保存,由于Timestamp是子类,因此写好的bean里面不需要修改数据类型。

pstmt.setTimestamp(15, new java.sql.Timestamp(Calendar.getInstance().getTime().getTime()));  //当前时间

pstmt.setTimestamp(16, new java.sql.Timestamp(userFile.getCreateTime().getTime()));  //指定时间

对于指定时间还可以用Calendar类的setTime()方法来设置

Calendar cal = Calendar.getInstance();

System.out.println(cal.getTime().getTime());

String string="2012-01-01 01:02:03";

SimpleDateFormat sp = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

java.util.Date da = sp.parse(string);

cal.setTime(da);

System.out.println(cal.getTime().getTime());

在数据库中插入带时分秒的时间需要用Timestamp。一般做这种操作用框架居多,我就说一下Hibernate吧。在数据库表中字段类型设置为Date数据类型,代码中映射的字段类型设置为 Timestamp类型, private Timestamp date;  在映射文件中 Type也是时间戳类型的。在赋值取值的时候用前面的操作获取到需要的时间的时间戳对象直接赋值就行。然后就可以用Hibernate执行方法将带时分秒的时间存入到数据库里了。(不过这一点意义好像不是很大,大多都是直接varchar2存进去,取时候再to_date一下或者在代码里处理)

还需要说一点的就是

在使用SimpleDateFormat时格式化时间的 yyyy.MM.dd 为年月日而如果希望格式化时间为12小时制的,则使用hh:mm:ss如果希望格式化时间为24小时制的,则使用HH:mm:ss,上代码:

SimpleDateFormat ss = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//12小时制

SimpleDateFormat sdformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//24小时制

Date d = new Date();

SimpleDateFormat ss = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//12小时制

System.out.println(ss.format(d));

Date date = new Date();

SimpleDateFormat sdformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//24小时制

String LgTime = sdformat.format(date);

System.out.println(LgTime);

结果为

2008-05-28 01:32:54

2008-05-28 13:32:54

Date类,已经很少用了。更多使用的是Calendar

Calendar    date    =    Calendar.getInstance();

date.get(Calendar.HOUR_OF_DAY    );//得到24小时机制的

date.get(Calendar.HOUR);//    得到12小时机制的

随机推荐

Hadoop 部署过程中的一些问题与解决方案

环境--> centos7.1 --> jdk1.8 1.JDK卸载与安装 http://blog.csdn.net/czmchen/article/details/41047187 2. ...

自动挂载文件/etc/fstab功能详解

今天看了这篇文章,对于自动挂载中的一些小细节和参数有了更深的理解,所以这次把它摘下来,留做查询 一./etc/fstab文件的作用 1.我们把磁盘手动挂载之后如果不把它写入/etc/fstab这个文件 ...

SAP ALV OO 选择行打印

&---------------------------------------------------------------------* *& Report  ZSDF001 * ...

UVA11396-Claw Decomposition(二分图判定)

题目链接 题意:能否将一张无向连通图分解成多个爪型.每一条边仅仅能属于一个爪型,每一个点的度数为3. 思路:当图分解成类干个爪型时,每条边仅仅属于一个爪子,所以每条边的两个点一定要处于2个不同的鸡爪中 ...

开始DDD

如何开始DDD(完) 连续写了两篇文章,这一篇我想是序的完结篇了.结合用户注册的例子再将他简单丰富一下.在这里只添加一个简单需求,就是用户注册成功后给用户发一封邮件.补充一下之前的代码 public ...

scrapy---callback 传递自定义参数

在scrapy提交一个链接请求是用 Request(url,callback=func) 这种形式的,而parse只有一个response参数,如果自定义一个有多参数的parse可以考虑用下面的方法实 ...

大家的备忘录——xpage_在同一页面展开文档显示该文档详细信息(可显示处理过的Rich Text)

Xpage大纲: 解析: 1.通过[link2]点击触发jQuery事件来展开[面板:thispanel] 2.[面板:thispanel]写了onClientLoad事件:让thispanel隐藏. ...

二叉树分派硬币 Distribute Coins in Binary Tree

2019-03-27 15:53:38 问题描述: 问题求解: 很有意思的题目.充分体现了二叉树的自底向上的递归思路. 自底向上进行运算,对于最底层的二叉子树,我们需要计算每个节点向其parent传送 ...

bzoj 2209 括号序列

反转操作 + 翻转操作 = 对称操作 因为上面三个操作都是自己的逆操作,所以我们只需要实现对称操作和反转操作,就可以搞定翻转操作. #include #include & ...

ASP.NET MVC4 Razor

2014-09-18 14:06 by 易code, 2854 阅读, 0 评论, 收藏, 编辑 1 Code Expressions  代码表达式 @表达式  or  @(Expressions ) ...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值