mysql(版本:5.1.50)的時(shí)間日期類型如下:
datetime 8bytes xxxx-xx-xx xx:xx:xx 1000-01-01 00:00:00到9999-12-31 23:59:59
timestamp 4bytes xxxx-xx-xx xx:xx:xx 1970-01-01 00:00:01到2038
date 3bytes xxxx-xx-xx 1000-01-01到9999-12-31
year 1bytes xxxx 1901到2155
time 3bytes xx:xx:xx -838:59:59到838:59:59(為了滿足時(shí)間的加減運(yùn)算)
java(1.6) 中能保存時(shí)間日期類型的類主要有
java.util.Date
java.util.Calendar
java.sql.Date
java.sql.Time
java.sql.Timestamp
以前從mysql中查詢出來(lái)的時(shí)間日期類型弛说,都放在java.util.Date類型里面了钝荡。這樣帶來(lái)一系列的問(wèn)題,首先這個(gè)類提供的時(shí)間操作函數(shù)太少潮梯,一般都需要轉(zhuǎn)換成java.util.Calendar再去操作;其次即使使用了java.util.Calendar煎娇,也不是很方便颜曾,一個(gè)很簡(jiǎn)單的想法钳幅,需要寫很多代碼才能實(shí)現(xiàn);java.util.Date的數(shù)據(jù)內(nèi)容為xxxx-xx-xx xx:xx:xx澜汤,有時(shí)候不需要時(shí)間蚜迅,只需要日期。從數(shù)據(jù)庫(kù)中取值出來(lái)的日期類型放到這個(gè)類中的時(shí)候俊抵,會(huì)在時(shí)間位自動(dòng)補(bǔ)上當(dāng)前時(shí)間谁不。這使得本來(lái)兩個(gè)日期在數(shù)據(jù)庫(kù)中是相等的,取出來(lái)放到這個(gè)類得時(shí)候就不再相等了徽诲,需要去考慮時(shí)間上的誤差刹帕,很是頭疼吵血。
java提供與mysql方便交互的三種數(shù)據(jù)類型
java.sql.Date
java.sql.Time
java.sql.Timestamp
它們都是繼承java.util.Date,算是對(duì)該類的精簡(jiǎn)偷溺,很適合跟數(shù)據(jù)庫(kù)交互蹋辅。
===========java注入數(shù)據(jù)庫(kù)==========
java類型 ? mysql類型 ? ? ? ?成功與否
date ? ? ? ? date ? ? ? ? ? ? ? yes
date ? ? ? ? time ? ? ? ? ? ? ? no
date ? ? ? ? timestamp ? ? ? no
date ? ? ? ? datetime ? ? ? ? no
time ? ? ? ? date ? ? ? ? ? ? ? no
time ? ? ? ? time ? ? ? ? ? ? ? yes
time ? ? ? ? timestamp ? ? ? no
time ? ? ? ? datetime ? ? ? ? no
timestamp date ? ? ? ? ? ? ?yes
timestamp time ? ? ? ? ? ? ?yes
timestamp timestamp ? ? yes
timestamp datetime ? ? ? ?yes
==========end?java注入數(shù)據(jù)庫(kù)========
總規(guī)律,如果A完全包含B挫掏,則A可以向B注入數(shù)據(jù)侦另,否則報(bào)錯(cuò)
==========從數(shù)據(jù)庫(kù)提取到j(luò)ava ==========
mysql類型 ? ?java類型 ? ? 成與否
date ? ? ? ? ? ? date ? ? ? ? yes
date ? ? ? ? ? ? time ? ? ? ? yes --------------缺少的部分使用歷元
date ? ? ? ? ? timestamp ? yes --------------缺少的部分使用歷元
time ? ? ? ? ? date ? ? ? ? ? yes --------------缺少的部分使用歷元
time ? ? ? ? ? time ? ? ? ? ? yes
time ? ? ? ? ?timestamp ? ?yes --------------缺少的部分使用歷元
timestamp date ? ? ? ? ? yes
timestamp time ? ? ? ? ? yes
timestamp timestamp ? yes
datetime ? ? ?date ? ? ? ? yes
datetime ? ? ?time ? ? ? ? yes
datetime ? ?timestamp ? yes
==========end?從數(shù)據(jù)庫(kù)提取到j(luò)ava=======
不會(huì)出錯(cuò),缺少的部分使用歷元尉共,而不是當(dāng)前日期時(shí)間
null to db(null) =====> 也是null
null to db(not null)=======> 數(shù)據(jù)庫(kù)報(bào)錯(cuò)
db(null) to java==========> 如果單字段出來(lái)传睹,則整個(gè)entity都是null,如果帶著其他不是null的字段出來(lái)洒敏,則可以實(shí)例化entity矗蕊,本身字段依然是null
db(not null) to java==========> 如果包含日期,則報(bào)錯(cuò)杠河,否則為000
最優(yōu)解決方案碌尔,定義成可以為null
java.sql時(shí)間系統(tǒng)的運(yùn)算系列
after,before
compareTo原小于參數(shù)返回<0,等于返回=0券敌,大于返回>0
優(yōu)點(diǎn):于數(shù)據(jù)庫(kù)同類型唾戚,可以方便傳輸(無(wú)論是從DB到src還是反方向),方便比較大小
缺點(diǎn):缺少運(yùn)算單元待诅,不適合時(shí)間跳躍的運(yùn)算和間隔的運(yùn)算
總結(jié):calendar具有強(qiáng)大的跳躍運(yùn)算和間隔運(yùn)算能力叹坦,在需要的時(shí)候,可以將sql系列的時(shí)間轉(zhuǎn)成calendar卑雁。
先設(shè)置calendar為歷元募书,然后從sql系列時(shí)間中轉(zhuǎn)換,最后再轉(zhuǎn)回sql系列時(shí)間测蹲。
calendar只用于時(shí)間有跳躍的轉(zhuǎn)換莹捡,對(duì)比運(yùn)算統(tǒng)一使用sql系統(tǒng),這樣代碼將更清晰
date 和 calendar怎么初始化為格林威治時(shí)間
new date(0)
calendar.setTimeInMillis(0)
sql系列時(shí)間
static valueOf
new XX(0)獲得歷元
new XX(year+1900, month+1,day,hour,minute,second,nano)已過(guò)時(shí)扣甲,創(chuàng)建也沒(méi)錯(cuò)
toString或者SimpleDateFormat