Java中Date插入数据库的一些问题总结(二)
来源:互联网 发布:南极人枕芯怎么样 知乎 编辑:程序博客网 时间:2024/05/21 22:42
Java中Date插入数据库的一些问题总结(二)
关于java.sql.Date中插入/提取数据库中 Date类型的date值–带有时分秒的方法
———————————–楼主温馨提示:以下内容可以忽略,直接从下个分割线阅读——————————–
书上一个项目把我给坑到了~此项目用java.sql.Date类,然后存入导出的日期是没有时间。出于优化的心态,我就想着看能不能把时分秒给加上,本以为是很简单的转换问题,结果一坑我就是半天~~
先看数据库里,date是datetime类型,存入的数据只有年月日,时间都是00:00:00;当时的我以为是简单的格式转换问题(受教育了~下次得把问题归结清楚,一通乱搞只会越来越乱~)就寻思着把时间获取然后重新转换一下格式,再存入不就OK了?如此一来存入数据库和导出展示都变成了美观的”yyyy-MM-dd HH:mm:ss”格式(2016-03-15 15:52:48)
原语句获取时间的代码是
setDate(new Date(System.currentTimeMills());
作为小白,只管百度,然后套用,这是一贯规律~于是搜索到了SimpleDateFormat对象,二话不说,开始套用,套用!然后一下午过去了~事情也没有解决。只能先把大概的收获总结一下:
1:System.currentTimeMillis() 返回long类型 可以强制转换成Date格式
2:SimpleDateFormat.format()返回的是 String类型,可以得到我上述的时间格式,但是是String类型。
3:SimpleDateFormat.parse()返回的是Date类型,该方法试图按照给定的SimpleDateFormat 对象的格式化存储来解析字符串,试过后发现,解析后的值是“格林威治时间格式“,即我当初设想的思路应该不能实现,转而改变策略,以任意格式把时间变成Date格式插入数据库中,提取的时候再做变换即可。
4:查询中发现java.util.Date 和 java.sql.Date存在一些区别,util.date用Date date = new Date(),util可以活动值,sql包必须给参数。
看来今天搞不定了,实在头大,休息了先。
———————————-这里!这里!我是下一个分割线T。T——————————–
接昨天的话。今儿请教了一下师兄们。算是解决了这个问题。
回头看这事的出现到解决,其实问题蛮多的。大致可分为
1. java.sql.Date 和 java.util.Date包之间的区别
2. 日期的类型转换之间的问题,String、Date、Long、Timestamp
3. 日期的格式化转变问题
—-这么些个问题堆在一起,让小白我感觉错综复杂,以致于烦躁、慌乱,解决问题的方向也发生偏差。好比这日期的格式化转变,我把它和类型转换一起做,甚至于还没搞明白什么类型就开始格式转换,绕来绕去得不到想要的结果。
今儿,翻看了一遍,问题本源是–“数据库在插入date类型的date时会出现时分秒丢失”造成的,而非date的类型转换导致。以下的内容就是如何保证date的插入和提取都带有时分秒;
正题开始:回忆下昨天的结果是获得了一个Date型的格林威治时间,插入数据库就只剩下年月日了,提取显示出来也只有年月日。我做的这个系统,把时间从获取到显示一共是经历了这么些步骤:
1.用户触发某事件后,系统来获取当前时间
ly.setDate(new Date(System.currentTimeMillis())); ```
2.之后转到DB类的addInfo()方法,向数据库里插入日期,我是用prepareStatement执行的SQL语句
static PreparedStatement pstmt; pstmt.setDate(1,new Date(System.currentTimeMillis()));
3.插入后再从数据库读出来,用DB.findInfo()方法
ly.setDate(rs.getDate(1));
4.然后main.jsp上获取显示,等于是这么4个步骤
<td><%=ly.getUserId()%></td>
现在分析步骤1这里的date值是OK的,date类型的包含时分秒的时间,然后到了步骤2,插入可以看到数据库没有时分秒了,这里查询了下。
java.sql.date 是为了数据库而设计的 是java.util.date 的子类。 数据库有date和datetime类型,前者是不带时分秒,后者带时分秒。此外不管是java.sql.date还是 java.util.date 存储为date是会丢失时分秒! java.sql.date 中1.如果数据库使用的是 getDate() 无疑没有时分秒,因为数据库没有 2.如果数据库使用的是getTimestamp,时分秒就不会丢失
我们可以看到不管是java.sql.date还是 java.util.date下把Date类型的date值,直接插入数据库确实会丢失掉时分秒。问题出在这里,就得百度想对策了,这时候发现同上文说的一样,可以用Timestamp来做,改成如下
ly.setDate(new Timestamp(System.currentTimeMillis()));
这里先贴一下两个方法,
private Date date; public Date getDate() { return date; } public void setDate(Date date) { this.date = date;
可以看到之前这里date的get和set方法都是用Date类型来做的,现在既然改成Timestamp型了,这里也得更改
private Timestamp timestamp; public Timestamp getDate() { return timestamp; } public void setDate(Timestamp timestamp) { this.timestamp = timestamp; }
这一下步骤1又OK了,可以插入了,然后还得改下步骤2的方法,pstmt的setDate() 得改成前面谈到的 setTimestamp()
pstmt.setTimestamp(1,new Date(System.currentTimeMillis()));
到了这里,写入部分OK了。做读取的话,我们还要继续修改步骤3,要把setDate改了,如下做相应的修改。
ly.setDate(rs.getTimestamp(3));
写完后运行应该OK了,不过会发现时间的精度好高,如这样:2016-03-16 15:23:07.223
这里我们再做转化,DB类中写一个dateChange()格式转化方法
public String dateChange(Timestamp timestamp){ try { SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String ss = sdf.format(timestamp); return ss; } catch (Exception e) { e.printStackTrace(); } return null; }
用SimpleDateFormat对象设置自定义的时间格式,调用format()方法转换出结果(这里结果是String型),然后步骤4改成
<td><%=new DB().dateChange(ly.getDate())%></td>
到这里就一切OK啦~输出时间格式:2016-03-16 15:23:07
- 参考文章
- java.sql.date的时分秒去哪里了?
- 关于PreparedStatement插入Date类型值的方法
- Java:String和Date、Timestamp之间的转换
哎呀呀~真的感觉写一篇记录解决问题的博客确实不如总结知识点来的轻巧~~之前的语序好乱,改了半天,希望可以帮到一些遇到同样问题的朋友们。如有问题,欢迎留言~谢谢~
- Java中Date插入数据库的一些问题总结(二)
- Java向MySQL数据库插入时间类型Date数据时需要注意的问题(二)
- java中Date, DateFormat的一些方法总结
- java中Date, DateFormat的一些方法总结
- java中Date, DateFormat的一些方法总结
- Java通过mybatis插入Oracle数据库中Date格式不显示到时分秒问题
- java中Date无法获取数据库时分秒的问题
- java中向数据库中插入date数据类型
- java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间
- java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间
- java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间
- java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间
- java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间
- java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间
- java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间
- java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间
- Java向MySQL数据库插入时间类型Date数据时需要注意的问题
- Java向MySQL数据库插入时间类型Date数据时需要注意的问题
- Java 从流中读取byte的奇怪现象,出现负值,详解
- Android Studio通过Gradle命令来编译生成打包APK
- PAT (Top Level) Practise 1011 Cut Rectangles (35)
- mac 升级自带svn
- checkenc - 自动文本编码识别
- Java中Date插入数据库的一些问题总结(二)
- Variably modified array at file scope
- 桂林电子科技大学操作系统课程设计(二)
- CodeForces 367A-Sereja and Algorithm【规律】
- D - Harmonic Number——(LightOJ 1234)
- Linux笔记(44)——不可改变位权限
- CSS Gradient详解
- 隐马尔科夫学习(HMM)
- 【BZOJ1898】[Zjoi2005]Swamp 沼泽鳄鱼【DP】【矩阵乘法】