Java DateTimeFormatter零输出为空
有没有办法让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.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
更新 如果必须使用,则可以使用创建一个,其中可以使用方法提供缺少的值 有关成功解析所需的字段,请参见:
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
来处理日期方面。当然,日期模式必须附加一天(除非您总是想假定为月的第一天)。实际上,我真正想要的是利用可变模式。。所以,即使你的答案是正确的,也不符合我的问题。实际上,我真正想要的是利用可变模式。。所以,即使你的答案是正确的,也不符合我的问题。