【问题标题】:Parsing timestamp as LocalDateTime将时间戳解析为 LocalDateTime
【发布时间】:2019-03-01 09:42:57
【问题描述】:

我想将yyyy-MM-dd'T'HH:mm:ss 形式的时间戳解析为LocalDateTime。这样做时,如果它们是 00,它会删除秒数。

As described here,我需要使用自定义格式化程序

LocalDateTime date = LocalDateTime.parse("2008-10-02T12:30:00");
DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");

String dateString = date.toString();
String dateFormatted = date.format(f);

System.out.println(dateString); // 2008-10-02T12:30

这个可行,但它返回一个String

System.out.println(dateFormatted); // 2008-10-02T12:30:00

当我将字符串解析为LocalDateTime 时,它会再次剥离00

LocalDateTime dateLDT = LocalDateTime.parse(dateFormatted, f);
System.out.println(dateLDT); // 2008-10-02T12:30

那么如何将日期解析为LocalDateTime,而不是String,并在末尾保留00

【问题讨论】:

  • 需要解析dateFormatted,问题出在哪里?您不能解析 LocalDateTime,您只能解析Strings - 而且Strings 必须具有正确的格式。日期如何选择重载其toString 方法对您来说并不重要,因为您总是必须使用格式化程序来获得任何正确的格式。
  • 我相信DateTimeFormatterBuilder 提供了可选元素,但您需要尝试一下
  • 看来你是要打印和解析dateFormatted不是 dateString
  • @ernest_k:请查看我的更新。它再次剥离了 00-es。
  • 这无关紧要 - 我重复我已经说过的话:“日期如何选择重载其 toString 方法对你来说并不重要,因为你总是必须使用格式化程序获得任何正确的格式。”

标签: java string date formatting localdate


【解决方案1】:

您应该期望两者之间的输出有所不同

LocalDateTime dateLDT = LocalDateTime.parse(dateFormatted, f);
System.out.println(dateLDT);

还有

System.out.println(dateLDT.format(f)) //or f.format(dateLDT)

System.out.println(dateLDT); 打印 dateLDT.toString() 的值,预计不会产生与您的模式相同的输出。

当您查看LocalDateTime.toString() 时,您会看到它将时间部分委托给LocalTime.toString(),它有条件地打印秒数:

public String toString() {
    ...
    if (secondValue > 0 || nanoValue > 0) {
        buf.append(secondValue < 10 ? ":0" : ":").append(secondValue);
        ...
        }
    }
    return buf.toString();
}

如果它的值为0,它只是省略秒字段。

在这种情况下,如果您必须确定输出/输入格式,您需要始终使用DateTimeFormatter 来格式化您的日期。

【讨论】:

  • 嗨@ernest_k 我有一个时间戳 [2020-08-26T11:41:25.310]。如何从中提取日期?我可以使用正则表达式,但在新的 Java.time 中有内置方法吗?
  • @MdBasha - LocalDateTime.parse("2020-08-26T11:41:25.310").toLocalDate() 应该返回 2020-08-26(作为 LocalDate 对象)。请注意,它可以在没有自定义模式的情况下工作,因为2020-08-26T11:41:25.310LocalDateTime 使用的默认格式
  • 好的明白了。谢谢!
【解决方案2】:

每个日期对象都有秒。它是否选择使用默认的toString 实现来显示它们并不重要。 如果你想要一个特定的格式,你总是需要使用格式化程序。

如果您想查看秒数,请使用适当的格式化程序或设置断点并检查对象。查看 any toString anything 的实现永远不能保证显示任何有用的东西或代表实际的对象状态。该对象可以只返回一个随机日期字符串。

现在你可以只使用date,它完全没问题,它有几秒钟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-30
    • 2015-04-02
    • 2017-10-15
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2018-12-19
    相关资源
    最近更新 更多