有没有办法像这样使用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)
答案 0 :(得分:2)
没有内置默认值。 您必须提供缺失值。
// 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()
,您可以使用DateTimeFormatter - Resolving方法提供缺失值。
// 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
至于成功解析所需的字段,请参阅:
答案 1 :(得分:0)
以防这个解决方案适合我,但我怀疑它不是&#34;泛型&#34;回答,因为我只需要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)
}
}