【问题标题】:SimpleDateFormat returns "Sun Oct 10 00:00:00 BRT 2010" but insert "2010-10-10"SimpleDateFormat 返回“Sun Oct 10 00:00:00 BRT 2010”,但插入“2010-10-10”
【发布时间】:2016-07-20 16:20:19
【问题描述】:

我有一个使用SimpleDateFormat的代码:

String data = jTData.getText();
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date dataInserir = null;
dataInserir = formatter.parse(data);
System.out.println(dataInserir);

如果来自jTData.getText()的字符串是“2010-10-10”,则此代码的输出是:

Sun Oct 10 00:00:00 BRT 2010.

但是,它在数据库中插入了值 2010-10-10。

字段是:

 @Temporal(javax.persistence.TemporalType.DATE)
    private Date data;

我错过了什么,我无法获得像 2010-10-10 这样的输出作为 Date ? 如果输出是Sun Oct 10 00:00:00 BRT 2010,为什么要插入值2010-10-10? 任何帮助,我将不胜感激,谢谢。

【问题讨论】:

  • 因为它们是相同的值。 Date 具有默认格式,但在内部是自纪元(1970 年 1 月 1 日)以来的毫秒数。 2010-10-10 10 月 10 日星期日。
  • 在这种情况下,如果我作为参数传递dataInserir,程序会将其理解为数据库中的2010-10-10
  • 这可能是因为数据库中的数据类型不同,自动格式化为它的数据类型
  • 如果您使用System.print.out(formatter.format(dataInserir)); 打印输出,您将获得与jData.getText() 相同的字符串值。
  • 我相信在大多数数据库实现中,日期列与日期时间或时间戳列不同,它没有时间组件。由于您指定列的类型是 TemporalType.DATE,因此您暗示与数据关联的日期库列是日期列,因此只保存一个日期。如果您需要日期和时间信息,请考虑使用日期时间数据库列并将时间类型更改为 TemporalType.timestamp。

标签: java mysql date simpledateformat


【解决方案1】:

我怀疑您混淆了 java.util.Date 类与 java.sql.Date 的性质。第一个是日期时间,第二个是仅日期。

您将注释标记为javax.persistence.TemporalType.DATE。该枚举的文档简单地说:

映射为 java.sql.Date

你说只存储日期。

所以你遇到的是一个特性,而不是一个错误。

如果您想存储带有时间的日期,请使用javax.persistence.TemporalType.TIMESTAMP 注释。

在数据库中的列上使用时间戳类型来支持它(应该几乎总是时间戳与时区类型)。

另外,我建议使用java.time 框架而不是麻烦的 java.util.Date 和 SimpleDateFormat 类。但那完全是另一个话题了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 2011-01-18
    • 2019-10-07
    • 1970-01-01
    相关资源
    最近更新 更多