如何以HH:MM格式将日期对象存储到MySql中?

时间:2014-02-21 01:47:35

标签: java datetime

我正在尝试从字符串示例13:30(HH:MM)创建日期对象(格式:HH:MM)。我想在MySql表中保存HH:MM,但下面的代码在列中输入一些随机值(例如:'6828-00-00 00:00:00')。如何以HH:MM格式将日期值存储在Mysql中?

Date date = null; 
String afternoon = "13" +":" +"30";
String time = afternoon;


try {                               
 date = new SimpleDateFormat("HH:mm").parse(time);
}
catch (ParseException e) {
    e.printStackTrace();
}

long d = date.getTime();
java.sql.Date sqlDate = new java.sql.Date(d);

 String sql3 = "CREATE TABLE IF NOT EXISTS DateTime"+
                       "(UniqueBusID VARCHAR(255) not NULL, " +
                       " Timenings DATETIME DEFAULT NULL ,"+
                       " PRIMARY KEY ( UniqueBusID ))";

stmt.executeUpdate(sql3);
stmt.executeUpdate("INSERT INTO DateTime " + "VALUES ('Test3','"+sqlDate.getTime()+"')");

2 个答案:

答案 0 :(得分:1)

修改

您必须使用java.sql.Timestamp代替java.sql.Date。来自javadoc,

  

“为了符合SQL DATE的定义,java.sql.Date实例包含的毫秒值必须通过在特定时区将小时,分钟,秒和毫秒设置为零来”标准化“。实例是关联的。“

所以只需替换

java.sql.Date sqlDate = new java.sql.Date(d);

java.sql.Timestamp sqlTime = new Timestamp(d);

你做得很好,除了用于解析StringDate的模式,即HH:mm,这是错误的。

正确格式:H:mmH:0-23; h:1-12)

try {                               
 date = new SimpleDateFormat("H:mm").parse(time);
}

以下是Date and Time Patterns

的参考资料

答案 1 :(得分:0)

我很惊讶它插入'6828-00-00 00:00:00': - )

这里有四个问题。

[1] 首先,当您设置SimpleDateFormat时,您将创建一个Java对象Date。 Java Date从1970年1月1日开始,所以如果你只设置小时和分钟,格式化程序将假设所有其他字段为零(而不是今天),所以

System.out.println(new SimpleDateFormat("HH:mm").parse("13:30")); // returns Thu Jan 01 13:30:00 BRT 1970

[2] 但是,你已经调用了getTime()方法,该方法从1970年1月1日起返回millis

System.out.println(new SimpleDateFormat("HH:mm").parse("13:30").getTime()); //59400000

[3] 然后,你试图将这个数字推入MySQL。 MySQL datetime需要格式为

的字符串
YYYY-MM-DD HH:MM:SS 

(见https://dev.mysql.com/doc/refman/5.0/en/datetime.html

由于MySQL是一个非常仁慈的数据库;-)它试图将59400000转换为这种格式,这显然是

的MySQL>插入d值(59400000); 查询正常,1行受影响(0.04秒)

mysql> select * from d;
+---------------------+
| y                   |
+---------------------+
| 5940-00-00 00:00:00 |
+---------------------+
1 row in set (0.08 sec)

[4] 当然,您可以将SimpleDateFormat调整为MySQL预期日期格式,但是您在INSERT查询中连接字符串,出于安全考虑,这不是一个好主意。相反,您应该使用PreparedStatement并设置Date对象(而不是millis)