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 <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.
eg:
[java] view plaincopy
<span style="font-size:18px;"> 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());</span>
把一个日期值写入数据库中,发现由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()方法来设置
[java] view plaincopy
<span style="font-size:18px;">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());</span>
在数据库中插入带时分秒的时间需要用Timestamp。一般做这种操作用框架居多,我就说一下Hibernate吧。在数据库表中字段类型设置为Date数据类型,代码中映射的字段类型设置为 Timestamp类型, private Timestamp date; 在映射文件中 <property name="date" type="timestamp" column="sj"/> Type也是时间戳类型的。在赋值取值的时候用前面的操作获取到需要的时间的时间戳对象直接赋值就行。然后就可以用Hibernate执行方法将带时分秒的时间存入到数据库里了。(不过这一点意义好像不是很大,大多都是直接varchar2存进去,取时候再to_date一下或者在代码里处理)
还需要说一点的就是
在使用SimpleDateFormat时格式化时间的 yyyy.MM.dd 为年月日而如果希望格式化时间为12小时制的,则使用hh:mm:ss 如果希望格式化时间为24小时制的,则使用HH:mm:ss,上代码:
[java] view plaincopy
SimpleDateFormat ss = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//12小时制
[java] view plaincopy
SimpleDateFormat sdformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//24小时制
[java] view plaincopy
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小时机制的
- java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和总结
在web开发中,避免不了对日期的操作,就几种常见的日期操作做个总结(部分参考网络,在此表示感谢): java.util.Date.java.sql.Date.java.sql.Time.java.sq ...
- java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和联系
java.util.Date.java.sql.Date.java.sql.Time.java.sql.Timestamp区别和联系 栏目:Java基础 作者:admin 日期:2015-04-19 ...
- 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 ...
- 解决Apache CXF 不支持传递java.sql.Timestamp和java.util.HashMap类型问题
在项目中使用Apache开源的Services Framework CXF来发布WebService,CXF能够很简洁与Spring Framework 集成在一起,在发布WebService的过程中 ...
- mybatis invalid comparison: java.sql.Timestamp and java.lang.String报错解决方法
这个错的意思是:java.sql.Timestamp和java.lang.String无效的比较 错误的原因是:拿传入的时间类型参数与空字符串进行比较就会报这个异常 解决方法:只保留非null判断就可 ...
- java向oracle数据库中插入当前时间
public class Test{public static void main (String args []){ java.util.Date a = new java.util.Date(); ...
- MySQL_(Java)使用JDBC向数据库中插入(insert)数据
MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC向数据库中插入(insert)数据 传送门 MySQL_(Java)使用JDBC向数据库中删除(d ...
- Java程序向MySql数据库中插入的中文数据变成了问号
找到mysql的安装目录,修改my.ini文件 (1)如何找到my.ini文件 如果my.ini文件不在MySQL的安装目录下,可能放在隐藏目录,要先去找到ProgramData,(这里要先打开显示隐 ...
- Sql 中获取年月日时分秒的函数
getdate():获取系统当前时间 dateadd(datepart,number,date):计算在一个时间的基础上增加一个时间后的新时间值,比如:dateadd(yy,30,getdate()) ...
随机推荐
- 服务器网站报错:由于扩展配置问题无法提供您请求的页面,请添加MIME映射,针对mp4,flv文件类型无法打开。
确保IIS正常 服务器增加mp4格式的MIME 类型映射设置的具体步骤是: “开始” > “控制面板” > “管理工具” >“Internet 信息服务(IIS管理器)”,“MIME ...
- Linux下安装项目管理工具Redmine
http://www.redmine.org.cn/download Linux下安装项目管理工具Redmine1.Ruby安装Ruby on Rails网站推荐使用1.8.7版. 点击(此处)折叠或 ...
- js回掉页面后台代码-简单demo
后台代码: public partial class WebForm1 : System.Web.UI.Page, ICallbackEventHandler { protected void Pag ...
- 小菜鸟 学MQ(二)
mq服务启动以后 接着要做的事情就是 [发送]和[接受]消息. 首先有两种不同类型的Message:Topic,Queue 第一种Topic JMS规范定义了,Topic需要实现 发布和订阅两个功能, ...
- 基本的mediaQuery写法,不复习又忘记了
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- hdu5536 字典树xor
一想到xor还要求最大类似的题,字典树效率高. 此代码c++ TLE. #include<stdio.h> #include<string.h> ; struct node { ...
- Java设计模式-桥接模式(Bridge)
桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化.桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时 ...
- svn版本控制方案:多分支并行开发,多环境自动部署
背景 keywords:svn,trunk,branch,jenkins,maven,merge 两地同时开发一个产品,目前线上有3个环境:测试环境.预发布环境.生产环境.目前系统部署采用jenkin ...
- mint锁屏设置
心血来潮,给笔记本装了linux,版本是当下最火的mint.唔,使用体验不错-下面记录的是修改mint锁屏相关设置的修改方式. In Linux Mint 13, the screen lock fe ...
- C++中尖括号和引号的区别---转载
如果你还看一些别的C++教程,那么你可能很早就发现了,有些书上的#include命令写作#include <文件名>,但有时候又会出现#include "文件名".你会 ...