Java DateTimeFormatter零输出为空

Java DateTimeFormatter零输出为空,java,Java,有没有办法让DateTimeFormatter这样 DateTimeFormatter.ofPattern("HH:mm") 它应该转换成LocalDateTime,然后将缺少的内容归零 实际上,在Joda上有DateTimeFormat,它返回了一个DateTime而不是一个例外。有没有类似的东西 val formatter = org.joda.time.format.DateTimeFormat.forPattern(pattern) formatter.parseDateTime(da

有没有办法让DateTimeFormatter这样

DateTimeFormatter.ofPattern("HH:mm")
它应该转换成LocalDateTime,然后将缺少的内容归零

实际上,在Joda上有DateTimeFormat,它返回了一个DateTime而不是一个例外。有没有类似的东西

val formatter = org.joda.time.format.DateTimeFormat.forPattern(pattern)
formatter.parseDateTime(data).toDate
在java8上,无论模式是什么,它都会生成一个真实的日期,而在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


更新

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

有关成功解析所需的字段,请参见:


    • 没有内置默认值。您必须提供缺少的值

      // 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


      更新

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

      有关成功解析所需的字段,请参见:


      以防此解决方案对我有效,但我怀疑它不是“通用”答案,因为我只需要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)
        }
      
      }
      

      以防这个解决方案对我有效,但我怀疑它不是一个“通用”答案,因为我只需要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)
        }
      
      }
      

      取决于你在找什么。你是否只关注小时和秒,或者你对一天永久设置为午夜感兴趣?你能发布更多的代码吗?不太喜欢多模式作品;与此相反,有更聪明的方法来处理这类事情。您可以使用
      LocalTime
      来处理时间,使用
      LocalDate
      来处理日期方面。当然,日期模式必须有一个附加的日期(除非你总是想假定是月的第一天)。这取决于你在寻找什么。你是否只关注小时和秒,或者你对一天永久设置为午夜感兴趣?你能发布更多的代码吗?不太喜欢多模式作品;与此相反,有更聪明的方法来处理这类事情。您可以使用
      LocalTime
      来处理时间,使用
      LocalDate
      来处理日期方面。当然,日期模式必须附加一天(除非您总是想假定为月的第一天)。实际上,我真正想要的是利用可变模式。。所以,即使你的答案是正确的,也不符合我的问题。实际上,我真正想要的是利用可变模式。。所以,即使你的答案是正确的,也不符合我的问题。