【问题标题】:Why is SimpleDateFormat not parsing my date correctly?为什么 SimpleDateFormat 不能正确解析我的日期?
【发布时间】:2010-11-09 01:46:52
【问题描述】:

我试图避免reinstalling Eclipse to solve this,所以我希望有人可以帮助解决这个日期解析问题。这就是我所做的。

DateFormat dateFormat; 

这是我班上的一个变量。我将其设置为以下。

dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
// Example input: 2010-11-07 16:00:00

当调用另一个方法时,我使用传入的字符串创建一个新的 java.sql.Date 实例。为了清楚起见,这里是一个缩短的版本。

public void aMethod (String activateTime, String expireTime) {
    Date example = new Date(dateFormat.parse(activateTime).getTime());
    Date example2 = new Date(dateFormat.parse(expireTime).getTime());
}

当我查看这些操作产生的字符串时(只需将 .toString() 添加到上面的实例化中),我得到如下输出

2010-10-30
2010-11-29

...而不是输入字符串,据报道是...

2010-10-30 17:00:00
2010-11-29 16:00:00

有人知道为什么它没有按照我指定的模式给我一个日期吗?

【问题讨论】:

    标签: java parsing date jdbc simpledateformat


    【解决方案1】:

    java.sql.Date 仅包含日期时间的日期部分。您可能想改用java.sql.Timestamp

    Timestamp example = new Timestamp(dateFormat.parse(activateTime).getTime());
    Timestamp example2 = new Timestamp(dateFormat.parse(expireTime).getTime());
    

    它在一般的 SQL 数据库中也是如此。 DATE 数据类型仅代表日期,TIME 数据类型仅代表时间。 TIMESTAMP 数据类型(有时称为DATETIME)表示日期和时间。

    请注意,您的小时模式不正确。对于给定的示例,您更愿意使用HH 而不是hh。另请参阅SimpleDateFormat javadoc

    另见:

    【讨论】:

    • java.sql.Timestamp toString 方法返回格式“yyyy-mm-dd hh:mm:ss.fffffffff” - 仍然不是 OP 想要的,因为它包含纳秒精度。
    • 虽然卡梅伦提到的 dateFormat 实际上报告的不仅仅是日期时间的日期部分,但您对 HH 的看法是完全正确的。谢谢!
    • @Cameron:由于 OP 使用的是java.sql.Date 而不是java.util.Date,我没想到他会关心格式。使用java.sql.Date 的唯一目的是能够使用 JDBC 在 SQL 数据库中保存日期。将其用于演示目的是完全错误的。请注意,当您即将实际上将其保存在数据库中时,时间部分会丢失。因此,当您再次从 DB 中查询并格式化时,时间部分将显示为 00:00:00
    • 这是一个很好的警告,我想知道它是否与我遇到的另一个问题有关。我现在想知道是否必须移动符号和数字以满足我在 PL/SQL 中看到的“日期”格式。例如,2010-11-25 16:00:00 是否需要变为 11/25/2010 16:00:00?班级需要这似乎是一件非常愚蠢的事情。这也让我想知道使用 TimeStamp 是否可以避免头痛。
    • @BalusC:是的,你是对的,这是java.sql.Date 的不寻常用法。为了显示的目的,OP 似乎想要一种特定的格式,因此我的评论。
    【解决方案2】:

    java.sql.Date 的 javadocs 指定 toString 方法返回格式为“yyyy-mm-dd”的字符串,因此您看到了正确的行为。 Date 对象不知道您用于创建它的格式化程序。要获得相同格式的输出,请使用DateFormat.format 方法而不是toString

    public void aMethod (String activateTime, String expireTime) {
        Date example = new Date(dateFormat.parse(activateTime).getTime());
        Date example2 = new Date(dateFormat.parse(expireTime).getTime());
        System.out.println(example.toString() + " vs " + dateFormat.format(example));
        System.out.println(example2.toString() + " vs " + dateFormat.format(example2));
    }
    

    【讨论】:

      【解决方案3】:

      您是否尝试将 java.sql.Date 更改为 java.util.Date?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-28
        相关资源
        最近更新 更多