存儲(chǔ)格式
date:yyyy-mm-dd
time:hh:mm:ss
timestamp:yyyy-mm-dd hh:mm:ss
對(duì)應(yīng)Java類(lèi)型
date:java.sql.Date
time:java.sql.Time
timestamp:java.sql.Timestamp
上述三種類(lèi)型都是繼承自java.util.Date侵俗,所以Java中獲取的結(jié)果最后都是轉(zhuǎn)換為java.util.Date進(jìn)行處理的,轉(zhuǎn)換之后對(duì)應(yīng)的時(shí)間(long)是不變的。
Java利用JDBC從數(shù)據(jù)庫(kù)中獲取日期數(shù)據(jù)
相關(guān)建表語(yǔ)句:
CREATE TABLE `time_table` (
`date1` date DEFAULT NULL,
`time1` time DEFAULT NULL,
`timestamp1` timestamp NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `time_table` VALUES ('2020-08-04', '14:49:54', '2020-07-22 14:49:56');
此時(shí)數(shù)據(jù)庫(kù)中的數(shù)據(jù)為:Java從數(shù)據(jù)庫(kù)中讀取日期的數(shù)據(jù)的時(shí)候可能會(huì)有類(lèi)型轉(zhuǎn)換纬朝,例如jdbcType為timestamp而Java讀取的數(shù)據(jù)類(lèi)型是java.sql.Time渐苏,jdbcType為date而Java讀取的數(shù)據(jù)類(lèi)型是java.sql.TimeStamp掀潮。
不同類(lèi)型的轉(zhuǎn)換遵從以下原則(以下的輸出都是轉(zhuǎn)換為java.util.Date進(jìn)行輸出格式為:yyyy-MM-dd HH:mm:ss):
- jdbcType為time,Java獲取類(lèi)型為java.sql.Date琼富,所有信息都會(huì)丟失輸出為:1970-01-01 00:00:00
- jdbcType為date仪吧,Java獲取類(lèi)型為java.sql.Time,所有信息都會(huì)丟失輸出為:1970-01-01 00:00:00
- timestamp分為date和time兩部分鞠眉,date部分"最原始"的值為:1970-01-01, time部分"最原始"的值為:00:00:00
- 只會(huì)從數(shù)據(jù)庫(kù)獲取已有的部分來(lái)匹配自己需要的部分薯鼠,自己不需要的部分設(shè)置為"最原始的值"。
如果滿足1或者2則不會(huì)用到規(guī)則3和4
針對(duì)規(guī)則4用以下例子進(jìn)行說(shuō)明
- timestamp1已有的部分為date和time凡蚜,java.sql.Time需要的部分為time人断,不需要的部分為date,所以輸出為1970-01-01 16:07:22
java.sql.Time sqlTime2 = rs.getTime("timestamp1");
Date javaDate = new Date(sqlTime2.getTime());
System.out.println(dateFormat.format(javaDate));
- time1已有的部分為time朝蜘,java.sql.Time所需要的部分為time恶迈,不需要的部分為date,所以輸出為1970-01-01 14:49:54
java.sql.Time sqlTime1 = rs.getTime("time1");
Date javaDate = new Date(sqlTime1.getTime());
System.out.println(dateFormat.format(javaDate));
總結(jié)
數(shù)據(jù)庫(kù)字段最好用timestamp并且獲取數(shù)據(jù)的時(shí)候不要用java.sql.Time谱醇,這樣才最有可能保證數(shù)據(jù)的準(zhǔn)確性暇仲。
感覺(jué)time類(lèi)型沒(méi)什么用。
JDBC向數(shù)據(jù)庫(kù)中寫(xiě)數(shù)據(jù)
向數(shù)據(jù)庫(kù)中寫(xiě)數(shù)據(jù)的時(shí)候一般是將java.util.Date轉(zhuǎn)換為相應(yīng)的格式副渴,基本上可以正確的設(shè)置奈附,代碼片段如下:
Connection coon = DriverManager.getConnection(URL, name, Password);
String sql = "INSERT INTO `time_table` VALUES (?, ?, ?)";
PreparedStatement preparedStatement = coon.prepareStatement(sql);
Date javaDate = new Date();
// 類(lèi)型正常成功設(shè)置。
preparedStatement.setDate(1, new java.sql.Date(javaDate.getTime()));
preparedStatement.setTime(2, new java.sql.Time(javaDate.getTime()));
preparedStatement.setTimestamp(3, new java.sql.Timestamp(javaDate.getTime()));