1. 程式人生 > >java和mysql之間的時間日期類型傳遞

java和mysql之間的時間日期類型傳遞

兩個 其他 方案 entity 最優解 都是 nan set mat

mysql(版本:5.1.50)的時間日期類型如下:

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(為了滿足時間的加減運算)

java(1.6) 中能保存時間日期類型的類主要有

java.util.Date

java.util.Calendar

java.sql.Date

java.sql.Time

java.sql.Timestamp

  以前從mysql中查詢出來的時間日期類型,都放在java.util.Date類型裏面了。這樣帶來一系列的問題,首先這個類提供的時間操作函數太少,一般都需要轉換成java.util.Calendar再去操作;其次即使使用了java.util.Calendar,也不是很方便,一個很簡單的想法,需要寫很多代碼才能實現;java.util.Date的數據內容為xxxx-xx-xx xx:xx:xx,有時候不需要時間,只需要日期。從數據庫中取值出來的日期類型放到這個類中的時候,會在時間位自動補上當前時間。這使得本來兩個日期在數據庫中是相等的,取出來放到這個類得時候就不再相等了,需要去考慮時間上的誤差,很是頭疼。

java提供與mysql方便交互的三種數據類型

java.sql.Date

java.sql.Time

java.sql.Timestamp

它們都是繼承java.util.Date,算是對該類的精簡,很適合跟數據庫交互。

===========java註入數據庫==========

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註入數據庫========
總規律,如果A完全包含B,則A可以向B註入數據,否則報錯

==========從數據庫提取到java ==========

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 從數據庫提取到java=======
不會出錯,缺少的部分使用歷元,而不是當前日期時間

null to db(null) =====> 也是null
null to db(not null)=======> 數據庫報錯
db(null) to java==========> 如果單字段出來,則整個entity都是null,如果帶著其他不是null的字段出來,則可以實例化entity,本身字段依然是null
db(not null) to java==========> 如果包含日期,則報錯,否則為000
最優解決方案,定義成可以為null

java.sql時間系統的運算系列

after,before
compareTo原小於參數返回<0,等於返回=0,大於返回>0

優點:於數據庫同類型,可以方便傳輸(無論是從DB到src還是反方向),方便比較大小
缺點:缺少運算單元,不適合時間跳躍的運算和間隔的運算

總結:calendar具有強大的跳躍運算和間隔運算能力,在需要的時候,可以將sql系列的時間轉成calendar。
先設置calendar為歷元,然後從sql系列時間中轉換,最後再轉回sql系列時間。
calendar只用於時間有跳躍的轉換,對比運算統一使用sql系統,這樣代碼將更清晰

date 和 calendar怎麽初始化為格林威治時間

new date(0)
calendar.setTimeInMillis(0)

sql系列時間

static valueOf

new XX(0)獲得歷元
new XX(year+1900, month+1,day,hour,minute,second,nano)已過時,創建也沒錯

toString或者SimpleDateFormat

java和mysql之間的時間日期類型傳遞