我正在尝试从字符串示例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()+"')");
答案 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);
你做得很好,除了用于解析String
为Date
的模式,即HH:mm
,这是错误的。
正确格式:H:mm
(H
:0-23; h
:1-12)
try {
date = new SimpleDateFormat("H:mm").parse(time);
}
的参考资料
答案 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)