存储格式
date:yyyy-mm-dd
time:hh:mm:ss
timestamp:yyyy-mm-dd hh:mm:ss
对应Java类型
date:java.sql.Date
time:java.sql.Time
timestamp:java.sql.Timestamp
上述三种类型都是继承自java.util.Date,所以Java中获取的结果最后都是转换为java.util.Date进行处理的,转换之后对应的时间(long)是不变的。
Java利用JDBC从数据库中获取日期数据
相关建表语句:
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');
此时数据库中的数据为:
image.png
Java从数据库中读取日期的数据的时候可能会有类型转换,例如jdbcType为timestamp而Java读取的数据类型是java.sql.Time,jdbcType为date而Java读取的数据类型是java.sql.TimeStamp。
不同类型的转换遵从以下原则(以下的输出都是转换为java.util.Date进行输出格式为:yyyy-MM-dd HH:mm:ss):
jdbcType为time,Java获取类型为java.sql.Date,所有信息都会丢失输出为:1970-01-01 00:00:00
jdbcType为date,Java获取类型为java.sql.Time,所有信息都会丢失输出为:1970-01-01 00:00:00
timestamp分为date和time两部分,date部分"最原始"的值为:1970-01-01, time部分"最原始"的值为:00:00:00
只会从数据库获取已有的部分来匹配自己需要的部分,自己不需要的部分设置为"最原始的值"。
如果满足1或者2则不会用到规则3和4
针对规则4用以下例子进行说明
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));
总结
数据库字段最好用timestamp并且获取数据的时候不要用java.sql.Time,这样才最有可能保证数据的准确性。
感觉time类型没什么用。
JDBC向数据库中写数据
向数据库中写数据的时候一般是将java.util.Date转换为相应的格式,基本上可以正确的设置,代码片段如下:
Connection coon = DriverManager.getConnection(URL, name, Password);
String sql = "INSERT INTO `time_table` VALUES (?, ?, ?)";
PreparedStatement preparedStatement = coon.prepareStatement(sql);
Date javaDate = new Date();
// 类型正常成功设置。
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()));