java处理timestamp以及和date转换关系的总结.docx
《java处理timestamp以及和date转换关系的总结.docx》由会员分享,可在线阅读,更多相关《java处理timestamp以及和date转换关系的总结.docx(19页珍藏版)》请在冰点文库上搜索。
java处理timestamp以及和date转换关系的总结
Java中Date及Timestamp时间相关内容(基本上看这一份就可以了)
java.util.datejava.sql.datejava.sql.timestamp
整理一:
这里的一片文章,我个人认为讲解的很详细,有对java.sql.Date的使用还有困惑的请看。
java.sql.Date只存储日期数据不存储时间数据
//会丢失时间数据
preparedStatement.setDate(1,newjava.sql.Date(date.getTime()));
//可以这样来处理
preparedStatement.setTimestamp(1,newjava.sql.Timestamp(newjava.util.Date().getTime()));
//想要得到完整的数据,包括日期和时间,可以这样
java.util.Dated=resultSet.getTimestamp
(1);
//这样处理更合适一些,可以避免一些潜在Timestamp问题
java.util.Dated=newjava.util.Date(resultSet.getTimestamp
(1).getTime());
自己补的话
这样的话:
往数据库存储的时候可以接收java.util.Date类型再用getTime()方法得到代表那个Date对象的long值,再以这个long值构造一个Timestamp对象存进数据库中。
从存数据库里取的时候,可以先得到Timestamp用他的getTime()方法得到long值,再以这个long值构造一个java.util.Date对象,这样就可以对这个Date对象操作了。
不如说newSimpleTimeFormat("yyyyy-MM-ddHH:
mm:
ss").format()等等
整理二:
用Timestamp来记录日期时间还是很方便的,但有时候显示的时候是不需要小数位后面的毫秒的,这样就需要在转换为String时重新定义格式。
Timestamp转化为String:
SimpleDateFormatdf=newSimpleDateFormat("yyyy-MM-ddHH:
mm:
ss");//定义格式,不显示毫秒Timestampnow=newTimestamp(System.currentTimeMillis());//获取系统当前时间Stringstr=df.format(now); String转化为Timestamp:
SimpleDateFormatdf=newSimpleDateFormat("yyyy-MM-ddHH:
mm:
ss");
Stringtime=df.format(newDate());Timestampts=Timestamp.valueOf(time);
整理三:
在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.DateutilDate=newjava.util.Date(sqlDate.getTime()); //sql->util
java.sql.DatesqlDate=newjava.sql.Date(utilDate.getTime()); //util->sql
2.使用SimpleDateFormat类实现转换
SimpleDateFormat是一个以国别敏感的方式格式化和分析数据的具体类。
它允许格式化(date->text)、语法分析(text->date)和标准化。
SimpleDateFormatdateFormat=newSimpleDateFormate("yyyy-MM-ddHH:
mm:
ss");
java.util.DateutilDate=dateFormat.parse(sqlDate.toString());
3.直接转换
由于java.sql.Date是从java.util.Date中继承过来的,所以可以直接用:
utilDate=sqlDate;
4.另类获得日期的方法:
SimpleDateFormatsy=newSimpleDateFormat("yyyy");
SimpleDateFormatsm=newSimpleDateFormat("MM");
SimpleDateFormatsd=newSimpleDateFormat("dd");
Stringsyear=sy.format(date);
Stringsmon=sm.format(date);
Stringsday=sd.format(date);
ps:
java.util.Date类中的getYear()要加上1900才可得到实际值,getMonth()则要加上1
有关java中的Date,String,Timestamp之间的转化问题
一.获取系统当前时间:
1.System.out.println(newTimestamp(newjava.util.Date().getTime)); //包含时分秒
2.System.out.println(newjava.sql.Date(newjava.util.Date().getTime)); //不包含时分秒
3.通过格式化类获取任意格式的时间
SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddkk:
mm:
ssSSS");Stringtime=sdf.format(Calendar.getInstance().getTime());System.out.println(time);
sql包的Date类没有无参的构造函数,而util的Date类有无参的构造函数
java.util.Datedate=newjava.util.Date();是正确的 //TueJun1509:
04:
23CST2010
java.sql.Datedate=newjava.sql.Date();是错误的
但是sql包的Date有一个带long型参数的构造函数,因此可以使用以下方式
java.sql.Datedate=newjava.sql.Date(newjava.util.Date().getTime()); //2010-6-17
newjava.util.Date():
构造函数没有接受任何参数.而这个构造函数在内部使用了System.currentTimeMillis()方法来从系统获取日期.下面是util包的Date的构造方法:
publicDate(){this(System.currentTimeMillis());}
还发现一件怪异的事情:
//String转化成dateStringstr="9-29-2001";
System.out.println(java.sql.Date.valueOf(str));
输出:
0016-10-21
真是奇怪.
三.Date转化成String
//Date转化成String:
SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:
mm:
ssSSS");
System.out.println(sdf.format(newDate()));
输出:
2010-06-1716:
30:
21781
四.Timestamp转化成String
SimpleDateFormatdf=newSimpleDateFormat("yyyy-MM-ddHH:
mm:
ss");//定义格式,不显示毫秒
Timestampnow=newTimestamp(System.currentTimeMillis());//获取系统当前时间
Stringstr=df.format(now);
System.out.println(str);
输出:
2010-06-1716:
46:
34
五.String转化成Timestamp
SimpleDateFormatdf1=newSimpleDateFormat("yyyy-MM-ddHH:
mm:
ss");
java.util.Datedate11=df1.parse("2010-6-216:
10:
38.00");
Stringtime=df1.format(date11);
Timestampts=Timestamp.valueOf(time);
System.out.println(ts);
输出:
2010-06-0216:
10:
38.0
引用
还发现一件怪异的事情:
//String转化成dateStringstr="9-29-2001";
System.out.println(java.sql.Date.valueOf(str));
Date#valueOf(String)的String格式都是yyyy-mm-dd.
引用
五.String转化成Timestamp
SimpleDateFormatdf1=newSimpleDateFormat("yyyy-MM-ddHH:
mm:
ss");
java.util.Datedate11=df1.parse("2010-6-216:
10:
38.00");
Stringtime=df1.format(date11);
Timestampts=Timestamp.valueOf(time);
System.out.println(ts);
这样的构造是没有效率的,Timestamp是java.util.Date的子类,可以这么做:
newTimestamp(java.util.Date#getTime());
段箭*残箫写道
还发现一件怪异的事情:
//String转化成dateStringstr="9-29-2001";
System.out.println(java.sql.Date.valueOf(str));
输出:
0016-10-21
真是奇怪.
你从 公元9年1月1日算起,加上2001天,和29个月,时间就是 公元16年10月21日
Timestamp是由java.util.Date和单独的毫微秒值组成。
只有整数秒才会存储在java.util.Date组件中。
小数秒(毫微秒)是独立存在的。
传递java.util.Date类型的值时,Timestamp.equals(Object)方法永远不会返回true,因为日期的毫微秒组件是未知的。
鉴于Timestamp类和上述java.util.Date类之间的不同,建议代码一般不要将Timestamp值视为java.util.Date的实例。
Timestamp和java.util.Date之间的继承关系实际上指的是实现继承,而不是类型继承。
Timestamp的解释1:
timestamp这个类的构造函数是
Java代码
1.Timestamp(Date timestamp, CertPath signerCertPath)
Timestamp(Datetimestamp,CertPathsignerCertPath)
date对象是不需要制定格式的。
。
。
我不明白有什么地方需要用到这个类,你完全可以通过long来表示时间。
。
。
虽然不理解你的做法,但是如果你要yyyy-mm-ddhh:
mm:
ss
Java代码
1.Date d1 = new Date();
2.SimpleDateFormat smf=new SimpleDateFormat("yyyy-MM-dd HH:
mm:
ss");
3.String s1=smf.format(d1);
4.System.out.println(s1);
Dated1=newDate();
SimpleDateFormatsmf=newSimpleDateFormat("yyyy-MM-ddHH:
mm:
ss");
Strings1=smf.format(d1);
System.out.println(s1);
beneo(架构师)2010-12-31
呵,兄弟,你描述得真的是很难理解:
1、timestamp到底是指数据库的字段类型,还是java中的java.sql.Timestamp类
2、如果你是指数据库查询的比较的话,跟""、null这种值比较是没问题的
3、
构造函数1:
//已不建议使用
@Deprecated
publicTimestamp(intyear,intmonth,intdate,
inthour,intminute,intsecond,intnano)
构造函数2:
//time时间对应的毫秒数
publicTimestamp(longtime)
如:
Timestampts=newTimestamp(1293804215328);
4、如果说构建Timestamp对象的话,那么格式有限制的只有这方法了
Timestampts1=Timestamp.valueOf("2010-12-3122:
22:
22");
Timestampts2=Timestamp.valueOf("2010-12-3122:
22:
22.23");
格式必须为:
yyyy-mm-ddhh:
mm:
ss[.f...]
解释2:
一般在页面通过时间查询的时候,在后台获取到的值为字符串,要设置到Date或Timestamp对象中时,需要将时间字符串转化为对象。
Java代码
1.import java.sql.Timestamp;
2.import java.text.DateFormat;
3.import java.text.ParseException;
4.import java.text.SimpleDateFormat;
5.import java.util.Date;
6.
7./**
8. *
9. */
10.
11./**
12. * @author qiuzj
13. *
14. */
15.public class Test {
16.
17. /**
18. * @param args
19. * @throws ParseException
20. */
21. public static void main(String[] args) throws ParseException {
22. // 日期时间格式
23. DateFormat datetimeDf = new SimpleDateFormat("yyyy-MM-dd HH:
mm:
ss");
24.
25. // 假设这个是从前台查询传过来的时间字符串
26. String dateStr = "2010-12-31 22:
22:
22";
27.
28. // 根据日期时间格式将时间字符串转化为对象
29. Timestamp ts = Timestamp.valueOf(dateStr);
30. Date date = datetimeDf.parse(dateStr);
31.
32.
33. // 日期
34. DateFormat dateDf = new SimpleDateFormat("yyyy-MM-dd");
35.
36. // 日期字符串
37. dateStr = "2010-12-31";
38.
39. // 根据日期格式将时间字符串转化为对象
40. date = dateDf.parse(dateStr);
41. ts = new Timestamp(date.getTime());
42.
43. }
44.
45.}
解释4:
应该仔细的阅读api的,你看在java.sql.Timestamp有个long型的构造函数Timestamp(long),这样的话你可以输入long型的变量,long型的构造请参阅Calendar
此外,将使用JDBC时间戳转义格式的String对象转换为Timestamp值的话,你可以使用Timestamp#valueOf(String)
输入的字符串可以是二者之一,对应不同的精度:
*yyyy-mm-ddhh:
mm:
ss格式下的字符数
*yyyy-mm-ddhh:
mm:
ss.[fff...]格式下的字符数(fff表示纳秒)
以上,是回答你的问题,以下是推荐给你的
一般来说,我们可以通过js直接生成yyyy-mm-ddhh:
mm:
ss的字符串的,因为js的时间,我们都是通过日历点出来的,一般都有年月日还有小时分秒,你可以参考以下链接
没有显示小时分秒的多试试几个
beneo(架构师)2011-01-01
Java代码
1.public void doPost(HttpServletRequest request, HttpServletResponse response)
2. throws ServletException, IOException {
3.
4. Timestamp timeUseForSearchInDatabase = null;
5.
6. //假设你前台传来的用于查询的时间字符串名称为searchDate
7. String searchDate = request.getParameter("searchDate");
8. //假设你前台传入的日期格式为2010-08-05 11:
20:
12(yyyy-MM-dd HH:
mm:
ss)
9. if (null !
= searchDate && !
"".equals(searchDate)) {
10. try {
11. timeUseForSearchInDatabase = new Timestamp(new SimpleDateFormat("yyyy-MM-dd HH:
mm:
ss").parse(searchDate).getTime());
12. } catch (ParseException e) {
13. e.printStackTrace();
14. }
15. }
16.
17. //这时timeUseForSearchInDatabase就可以直接放到Hibernate的实体对应字段中去了
18. //其实,hibernate中对应数据库中的DateTime类型,实体中可以采用java.util.Date类型,
19. //另外,Hibernate中的timestamp类型的字段是可以为null的,但不能为"";其实""你也注入不进去,因为""是字符串类型的,你所说的前台页面表单中
20. //什么也不输时报错,是因为页面中的任何表单不输入内容,传到后台的值将都是字符串"",而不是null,这个你要处理的,你要将""转换成null,
21. //你用了SSH,可以使用Struts的过滤器自动过滤,但也可以使用我上面这种方法(虽然有点笨,有点烦,但还是比较实用的)。
22.
23. /**
24. * 下面向你介绍一下我对日期类型的处理办法:
25. * 1、页面前台:
①、使用日期控件,直接限制用户的输入日期格式(html页面中的日期输入控件有很多,我常用My97DatePicker,简介方便),这样前台用户输入的
26. * 日期要么是空字符串"",要么是我们预设好的日期格式,传到后台后按照规则解析处理即可。
②、使用js的验证功能强行用户输入指定格式的日期