DateTimeFormatter清零为空

  • 本文关键字:DateTimeFormatter java
  • 更新时间 :
  • 英文 :


有没有像那样的DateTimeFormatter

DateTimeFormatter.ofPattern("HH:mm")

它应该转换为LocalDateTime,并将缺少的内容清零?

事实上,在Joda上有一个DateTimeFormat,它返回了DateTime,这并不是一个例外。有类似的东西吗?

val formatter = org.joda.time.format.DateTimeFormat.forPattern(pattern)
formatter.parseDateTime(data).toDate

无论模式是什么,都将始终产生一个真实的日期,而在java8上,它表示缺少LocalDate。

实际上,模式应该是可变的,这样人们就可以插入HH:mm和dd.mm.yyyy,并始终获得LocalDateTime,该时间应该初始化/默认为1970-01-01T00:00。

这么做:

// with pattern HH:mm
formatter.parse("00:00") should yield LocalDateTime.of(1970, 01, 01, 0, 0)
// with pattern YYYY-mm
formatter.parse("2016-11") should yield LocalDateTime.of(2016, 11, 01, 0, 0)

没有内置默认值必须提供缺失的值。

// Parse HH:mm
LocalDateTime ldt1 = LocalTime.parse("12:34")
                              .atDate(LocalDate.of(1970, 1, 1));
System.out.println(ldt1); // Prints 1970-01-01T12:34
// Parse YYYY-mm
LocalDateTime ldt2 = YearMonth.parse("2016-11")
                              .atDay(1)
                              .atStartOfDay();
System.out.println(ldt2); // Prints 2016-11-01T00:00

请注意,它们中的任何一个都不需要DateTimeFormatter


更新

如果必须使用DateTimeFormatter,则可以使用DateTimeFormatterBuilder创建一个,其中可以使用parseDefaulting()方法提供缺少的值。

// Parse HH:mm
DateTimeFormatter formatter1 = new DateTimeFormatterBuilder()
        .appendPattern("HH:mm") // other time fields default to 0, see "Resolving"
        .parseDefaulting(ChronoField.EPOCH_DAY, 0) // short for 1970-01-01
        .toFormatter();
LocalDateTime ldt1 = LocalDateTime.parse("12:34", formatter1);
System.out.println(ldt1); // Prints 1970-01-01T12:34
// Parse YYYY-mm
DateTimeFormatter formatter2 = new DateTimeFormatterBuilder()
        .appendPattern("uuuu-MM")
        .parseDefaulting(ChronoField.DAY_OF_MONTH, 1) // see resolveDate()
        .parseDefaulting(ChronoField.NANO_OF_DAY, 0) // short for 00:00:00.000000000
        .toFormatter();
LocalDateTime ldt2 = LocalDateTime.parse("2016-11", formatter2);
System.out.println(ldt2); // Prints 2016-11-01T00:00

关于成功解析需要哪些字段,请参阅:

  • DateTimeFormatter-正在解析
  • IsoChronology.resolveDate()

以防万一这个解决方案对我有效,但我怀疑它不是一个"通用"答案,因为我只需要LocalDateTime和它的scala:

object MyDate {
  def parse(text: CharSequence, formatter: DateTimeFormatter): MyDate = new MyDate(formatter.parse(text))
}
class MyDate(accessor: TemporalAccessor) {
  private[this] def getOrDefault(field: TemporalField, default: Int): Int = {
    if (accessor.isSupported(field)) accessor.get(field) else default
  }
  def toLocalDateTime: LocalDateTime = {
    val year: Int = getOrDefault(ChronoField.YEAR, 1970)
    val month: Int = getOrDefault(ChronoField.MONTH_OF_YEAR, 1)
    val day: Int = getOrDefault(ChronoField.DAY_OF_MONTH, 1)
    val hour: Int = getOrDefault(ChronoField.HOUR_OF_DAY, 0)
    val minute: Int = getOrDefault(ChronoField.MINUTE_OF_HOUR, 0)
    LocalDateTime.of(year, month, day, hour, minute)
  }
}

最新更新