如何使用JPA将Java日期存储为Mysql日期时间?

116

有谁能告诉我如何将Java Date存储到Mysql datetime中吗?

当我尝试这样做时,只有日期被存储,时间保持为00:00:00。在Mysql中,日期以这种方式存储...

2009-09-22 00:00:00

我不仅想要日期,还需要时间...就像这样

2009-09-22 08:08:11

我正在使用Spring与JPA(Hibernate)开发,我的实体类中使用了java.util.Date,但我使用手写SQL语句创建了表格...

以下是我的创建表格语句:

CREATE TABLE ContactUs (
  id BIGINT AUTO_INCREMENT, 
  userName VARCHAR(30), 
  email VARCHAR(50),
  subject VARCHAR(100), 
  message VARCHAR(1024), 
  messageType VARCHAR(15), 
  contactUsTime DATETIME,
  PRIMARY KEY(id)
);

你的代码片段,也许? - Bozho
1
链接: http://www.coderanch.com/t/304851/JDBC/java/Java-date-MySQL-date-conversion - Haim Evgi
2
现在你不应该再使用java.util.Date了(在2010年也许没有更好的选择)。最好使用现代类,比如java.time.Instant或者java.time.LocalDateTime,这取决于你需要存储的日期时间的具体要求。 - Ole V.V.
有些旧的答案在谷歌排名中非常靠前。在Java 8+中,我们可以简单地使用LocalDateTime来保存日期时间,而不是使用@Temporal来保存日期时间格式。 - HopeKing
preparedStatement.setTimestamp(1, new Timestamp(System.currentTimeMillis())); 预处理语句.set时间戳(1, new 时间戳(System.currentTimeMillis())); - Rajat
13个回答

170

6
当前时间是一个字符串对象,而在数据库中我们使用日期时间作为数据类型,我认为它不能被插入,对吗? - reddy
yyyy-MM-dd HH:mm:ss 非常重要。请注意大写字母。 - biniam

98

在字段(或getter方法)上加上注释 @Temporal(TemporalType.TIMESTAMP),像这样:

public class MyEntity {
    ...
    @Temporal(TemporalType.TIMESTAMP)
    private java.util.Date myDate;
    ...
}

那应该就可以了。


2
这确实是答案! - Perneel
2
对于这个问题,这是正确的答案。 - Ryan
4
请注意,如果选择此解决方案,在从数据库中获取日期时,它将显示为时间戳,而不是类似于“yyyy-MM-dd....”这样的良好格式。 - jon

38

您是否正在使用java.sql.Date?虽然它作为Java类具有毫秒级精度(它是java.util.Date的子类,这是一个糟糕的设计决定),但JDBC驱动程序会将其解释为没有时间组件的日期。您需要改用java.sql.Timestamp


1
我不会在领域类中使用 java.sql.Datejava.sql.Timestamp,但我猜这是在 OP 编辑之前写的。 - Pascal Thivent
我会。java.util.Date对象与java.sql.Timestamp对象的比较结果并不完全可预测。 - Doug Moscrop

7

可能是因为您的Java日期格式与mysql格式YYYY-MM-DD HH:MM:SS)不同

请执行以下操作

 DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
 Date date = new Date();
 System.out.println(dateFormat.format(date));

你在参考文献中提到了正确的格式,但在代码中使用了错误的格式。 - Merric Huffstutler

6

您将获得2011-07-18+时间格式

long timeNow = Calendar.getInstance().getTimeInMillis();
java.sql.Timestamp ts = new java.sql.Timestamp(timeNow);
...
preparedStatement.setTimestamp(TIME_COL_INDEX, ts);

5

将 MySQL 的 datetime 转换为 GregorianCalendar

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse("2012-12-13 14:54:30"); // mysql datetime format
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);
System.out.println(calendar.getTime());

将GregorianCalendar转换为mysql datetime

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String string = format.format(calendar.getTime());
System.out.println(string);

4
java.util.Date date = new Date();
Object param = new java.sql.Timestamp(date.getTime());    
preparedStatement.setObject(param);

1
如果使用Java 8或更高版本,请尝试使用LocalDateTime。如果您正在使用DATETIME作为MySQL数据类型,则这是正确的类型。
以下是将当前时间转换为“2009-09-22 08:08:11”格式的示例。
LocalDateTime currentTime = LocalDateTime.parse(LocalDateTime.now().toString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

1
使用以下代码将日期插入MySQL。我们可以通过设置STR_TO_DATE(?, '%l:%i %p')参数来帮助数据库识别我们的日期,而不是改变我们的日期格式以满足MySQL的要求。
例如,2014年3月12日可以表示为STR_TO_DATE('2014-03-12', '%Y-%m-%d')
preparedStatement = connect.prepareStatement("INSERT INTO test.msft VALUES (default, STR_TO_DATE( ?, '%m/%d/%Y'), STR_TO_DATE(?, '%l:%i %p'),?,?,?,?,?)"); 

1

虽然这很简单,但是在这个答案中的条件是mysql中列的数据类型为datetime,你希望从Java代码向mysql发送数据:

java.util.Date dt = new java.util.Date();
无论您的代码对象是什么.setDateTime(dt);

重要的是只需选择日期,其格式已经符合mysql格式并发送它,不需要进一步修改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接