date   Leave a comment

java.util.Datejava.sql.Date的精确保存问题

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

Java代码   

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

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


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

Java代码   

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

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

 

 

java.sql.datejava.util.date与数据库中的date字段的转换方法[]

1、如何将java.util.Date转化为java.sql.Date?
转化:

java.sql.Date sd;
java.util.Date ud;
//initialize the ud such as ud = new java.util.Date();

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

2、如果要插入到数据库并且相应的字段为Date类型
那么可以用PreparedStatement.setDate(int
,java.sql.Date)
方法
其中的java.sql.Date可以用上面的方法得到

 

也可以用数据库提供TO_DATE函数
比如 现有 ud
TO_DATE(new SimpleDateFormat().format(ud,"yyyy-MM-dd HH:mm:ss"),
"YYYY-MM-DD HH24:MI:SS")
注意java中表示格式和数据库提供的格式的不同

一个实际的例子

sql="update
tablename set timer=to_date(‘"+t+"’,’yyyymmddhh24miss’) where
….."

这里的t为变量为类似:20051211131223

 

3、如何将"yyyy-mm-dd"格式的字符串转换为java.sql.Date

方法1

SimpleDateFormat
bartDateFormat =  
        new
SimpleDateFormat("yyyy-MM-dd");  

 

 


       String dateStringToParse =
"2007-7-12";  
       try {  
        java.util.Date date =
bartDateFormat.parse(dateStringToParse);  
        java.sql.Date sqlDate = new
java.sql.Date(date.getTime());
       
System.out.println(sqlDate.getTime());  
       }  
       catch (Exception ex) {  
        System.out.println(ex.getMessage());  
       }

————————————————————
方法2
       String    
strDate     =    
"2002-08-09";   

 

      
StringTokenizer     st    
=     new    
StringTokenizer(strDate,    
"-");   
       java.sql.Date    
date     =    
new     java.sql.Date(Integer.parseInt(st.nextToken()),
               
Integer.parseInt(st.nextToken()),
                
Integer.parseInt(st.nextToken()));

  

java.util.Datejava.sql.Date的异同

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


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


        java.sql.Date
是为了配合SQL DATE而设置的数据类型。规范化java.sql.Date只包含年月日信息,时分秒毫秒都会清零。格式类似:YYYY-MM-DD。当我们调用 ResultSetgetDate()方法来获得返回值时,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值通过PrepareStatementsetDate方法存入数据库时,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.

Calendar


Calendar   calendar=Calendar.getInstance();  
//
获得当前时间,声明时间变量  
int   year=calendar.get(Calendar.YEAR);  
//
得到年
int   month=calendar.get(Calendar.MONTH);  
//
得到月,但是,月份要加上1  
month=month+1; 
int   date=calendar.get(Calendar.DATE);  
//
获得日期  
String  
today=""+year+"-"+month+"-"+date+"";

 


Posted 2009年11月9日 by gw8310 in date, java

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: