开发手册
文章插图
不推荐用
java.sql.Date
、java.sql.Time
网上说的文章有很多 。参考文章:一文告诉你Java日期时间API到底有多烂但为什么不推荐使用
java.sql.Timestamp
文章比较少 。原因【为什么阿里Java开发手册不推荐使用Timestamp】Oracle官网文档中这么写:
文章插图
可以看到,根源是因为
java.sql.Timestamp
父类java.sql.Date
的fastTime
属性存储秒,而java.sql.Timestamp
的nanos
存储秒以外的毫秒 。所以秒和毫秒是分别存储的 , 从Timestamp
的构造方法也可以看出来:public Timestamp(long time) { // 设置java.sql.Date的fastTime super((time/1000)*1000); // 设置java.sql.Timestamp的nanos if (nanos < 0) {nanos = 1000000000 + nanos;super.setTime(((time/1000)-1)*1000); }}
所以会有什么问题呢?- equals的问题
The Timestamp.equals(Object) method never returns true when passed an object that isn't an instance of java.sql.Timestamp, because the nanos component of a date is unknown.
文章插图
可能程序员会想,我两个时间都是从一个millis中创建的,那时间应该是一样的 。但是因为Timestamp的设计 , 它们的值不相等 。
- after的问题
文章插图
期待的答案应该是
false
。原因是:public boolean after(Date when) {return getMillisOf(this) > getMillisOf(when);}static final long getMillisOf(Date date) {if (date.cdate == null || date.cdate.isNormalized()) {return date.fastTime;}BaseCalendar.Date d = (BaseCalendar.Date) date.cdate.clone();return gcal.getTime(d);}
date对象的fastTime值为:1664429777371timestamp对象的fastTime值为:1664429777000
看一下Timestamp的构造方法:public Timestamp(long time) { // 设置java.sql.Date的fastTime super((time/1000)*1000); // 设置java.sql.Timestamp的nanos if (nanos < 0) {nanos = 1000000000 + nanos;super.setTime(((time/1000)-1)*1000); }}
可以知道timestamp对象的fastTime的后三位为0 。而看Date的构造方法:
public Date(long date) {fastTime = date;}
它是直接把传入的值赋值给fastTime 。总结不将
java.sql.Timestamp
和其它java.util.Date
的对象比较 。推荐阅读
- 大华海康NVR录像JAVA下载及WEB播放
- iQOO8为什么不建议买_iQOO8的缺点
- 华为手机怎么截屏三种方法(为什么华为不能截长屏)
- 人造钻石为什么不值钱 人造钻石为什么无法取代
- 为什么吉大燕子外网现在上不去呢?
- 罗盖肉为什么又叫罗汉肉?
- 为什么树叶是绿色的即评 为什么树叶是绿色的
- 皇太极的妃子海兰珠简介 皇太极为什么独宠海
- 为什么广州到郑州的高铁从二十号以后就全部停运了
- 为什么出现屁股上长了好多红疙瘩上面有白点的症状