如何使用JPA将Java Date存储到Mysql datetime


104

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

当我尝试这样做时...仅日期存储并且像这样在Mysql日期存储中保留时间00:00:00 ...

2009-09-22 00:00:00

我不仅要约会,而且要时间...

2009-09-22 08:08:11

我正在将JPA(Hibernate)与spring mydomain类一起使用java.util.Date,但是我已经使用手写查询创建了表...

这是我的创建声明

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))
                        TYPE=InnoDB;

您的代码片段,也许吗?
博佐


1
这些天,您应该完全不再使用java.util.Date(2010年可能没有更好的选择)。最好使用现代类,例如java.time.Instantjava.time.LocalDateTime,具体取决于您需要存储的日期时间的确切要求。
Ole VV

其中一些旧答案在Google排名中名列前茅。在Java 8+中,我们可以简单地使用LocalDateTime保存日期时间,而不是使用@Temporal以日期时间格式保存
HopeKing

prepareStatement.setTimestamp(1,new Timestamp(System.currentTimeMillis()));
拉贾特'18

Answers:


165

见链接:

http://www.coderanch.com/t/304851/JDBC/java/Java-date-MySQL-date-conversion

以下代码刚刚解决了该问题:

java.util.Date dt = new java.util.Date();

java.text.SimpleDateFormat sdf = 
     new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String currentTime = sdf.format(dt);

此“ currentTime ”已插入类型为DateTime的列中,并且成功。


4
但是,currentTime是一个String对象,在db中,我们将datetime作为数据类型,我认为它不会被插入。对吗?
2014年

yyyy-MM-dd HH:mm:ss非常重要。注意大写。
biniam 2015年

91

使用注释您的字段(或getter)@Temporal(TemporalType.TIMESTAMP),如下所示:

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

这应该够了吧。


2
确实是答案!
Perneel 2013年

2
为此,这是正确的答案。
Ryan 2014年

3
请注意,如果选择此解决方案,则从数据库中获取日期时,日期将显示为时间戳。它不会有很好的格式'yyyy-MM-dd ....')
2016年

37

您也许正在使用java.sql.Date?尽管它作为Java类具有毫秒级的粒度(它是java.util.Date错误的设计决策的子类),但JDBC驱动程序会将其解释为没有时间成分的日期。您必须改为使用java.sql.Timestamp


1
我不会使用java.sql.Datejava.sql.Timestamp在域类中使用,但我想这是在OP编辑之前编写的。
Pascal Thivent 2010年

我会。java.util.Date对象无法与具有完全可预测结果的java.sql.Timestamp对象进行比较。
Doug Moscrop 2011年

8

可能是因为您的Java日期格式与mysql formatYYYY-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的日期时间-> 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

使用以下代码将日期插入MySQL。无需更改日期的格式以满足MySql的要求,我们可以通过设置STR_TO_DATE(?, '%l:%i %p')参数来帮助数据库识别日期。

例如,2014-03-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 =新的java.util.Date();
whatever your code object may be.setDateTime(dt);

重要的是只需选择日期,它的格式已经按照mysql格式发送,无需进一步修改。


0

实际上,您可能不使用SimpleDateFormat,您可以使用类似以下的方式:

  @JsonSerialize(using=JsonDateSerializer.class)
  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy HH:mm:ss")
  private Date blkDate;

这样,您可以直接使用指定的格式获取日期。


0

我仍然更喜欢一行中的方法

new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime())

-2

这个对我有用 !!

在mysql表中

DATETIME

在实体中:

private Date startDate;

进行中:

objectEntity.setStartDate(new Date());

在prepareStatement中:

pstm.setDate(9, new java.sql.Date(objEntity.getStartDate().getTime()));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.