【问题标题】:How to prevent auto-generated 'T' letter when parsing String to LocalDateTime using DateTimeFormatterBuilder [duplicate]使用 DateTimeFormatterBuilder 将字符串解析为 LocalDateTime 时如何防止自动生成的“T”字母 [重复]
【发布时间】:2020-02-20 02:43:20
【问题描述】:

我有这段代码可以将String双向解析为LocalDateTime:

public class ConvertLocalDateToString {

private static final DateTimeFormatter CUSTOM_LOCAL_DATE;
static {
    CUSTOM_LOCAL_DATE = new DateTimeFormatterBuilder()
            .appendValue(YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
            .appendLiteral('-')
            .appendValue(MONTH_OF_YEAR, 2)
            .appendLiteral('-')
            .appendValue(DAY_OF_MONTH, 2)
            .appendLiteral(' ')
            .appendValue(HOUR_OF_DAY, 2)
            .appendLiteral(':')
            .appendValue(MINUTE_OF_HOUR, 2)
            .optionalStart()
            .appendLiteral(':')
            .appendValue(SECOND_OF_MINUTE, 2)
            .toFormatter();
}

public static void main(String[] args) {

    String str = "2020-02-18 15:04:30";
    LocalDateTime dateTime = LocalDateTime.parse(str, CUSTOM_LOCAL_DATE); //2020-02-18T15:04:30

    LocalDateTime addedDateTime = LocalDateTime.parse(dateTime.plusHours(10).format(CUSTOM_LOCAL_DATE.withZone(ZoneOffset.UTC)));
    System.out.println(addedDateTime);
    System.out.println(dateTime); //2020-02-18T15:04:30

}

我的假设是“T”字母是由 ISO-8601 格式自动生成的。这导致:

DateTimeParseException:无法在索引 10 处解析文本“2020-02-18 15:04:30”

我该如何摆脱它?

【问题讨论】:

  • LocalDateTime 中没有 T。这只是 System.out.println 如何工作的人工制品。如果您想要不同的格式,请在打印之前使用一种格式设置 LocalDateTime。
  • 乍一看有点难看,但您对LocalDateTime.parse 的第二次调用实际上并未将 CUSTOM_LOCAL_DATE 作为第二个参数传递。 one-argument LocalDate.parse method 需要 ISO 8601 格式,包括 T

标签: java datetime java-8 datetime-format


【解决方案1】:

System.out.println(dateTime)System.out.println(String.valueOf(dateTime)) 相同。

String.valueOf(dateTime)dateTime.toString() 相同,只是它可以处理null 值。

LocalDateTime 上调用toString()documented 来执行此操作:

将此日期时间输出为字符串,例如2007-12-03T10:15:30

输出将是以下 ISO-8601 格式之一:

  • uuuu-MM-dd'T'HH:mm
  • uuuu-MM-dd'T'HH:mm:ss
  • uuuu-MM-dd'T'HH:mm:ss.SSS
  • uuuu-MM-dd'T'HH:mm:ss.SSSSSS
  • uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSS

所使用的格式将是最短的输出时间的完整值,其中省略的部分被暗示为零。

如果您想要不同的格式,请致电format(DateTimeFormatter formatter)


所以,回答你的问题:

我的假设是“T”字母是由 ISO-8601 格式自动生成的。

T 不会比 -: 字符更自动生成。

我该如何摆脱它?

致电format(...)并指定您想要的格式,例如

System.out.println(dateTime.format(DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss")));

【讨论】:

    猜你喜欢
    • 2020-01-30
    • 2020-02-27
    • 2020-07-11
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 2012-12-30
    相关资源
    最近更新 更多