我已经测试了这个 JDK 1.8.0_131为Mac OS X 和 JDK 1.8.0111的Windows (包括工作)。
我创建了一个
DateTimeFormatter带有可选部分(以分隔
[])的,以解析两种情况(
MM/dd/yyyy和
yyyy-MM-dd'T'HH:mm:ss)。
相同的格式化程序适用于您的情况(
LocalDate),但以下是一些注意事项。
// parse both formats (use optional section, delimited by [])DateTimeFormatter parser = DateTimeFormatter.ofPattern("[MM/dd/yyyy][yyyy-MM-dd'T'HH:mm:ss]");// parse MM/dd/yyyyLocalDate d1 = LocalDate.parse("10/16/2016", parser);// parse yyyy-MM-dd'T'HH:mm:ssLocalDate d2 = LocalDate.parse("2016-10-16T10:20:30", parser);// parser.format(d1) is the same as d1.format(parser)System.out.println(parser.format(d1));System.out.println(parser.format(d2));输出为:
2016年10月16日
2016年10月16日
PS: 仅适用于
LocalDate。如果我尝试使用时间字段(例如
LocalDateTime)来格式化对象,则会使用两种格式:
System.out.println(parser.format(LocalDateTime.now()));
打印:
06/18 / 20172017-06-18T07:40:55
请注意,它使用两种模式进行格式化。我的猜测是,格式化程序会检查对象是否在每个可选节中都有字段。由于
LocalDate没有时间字段(小时/分钟/秒),因此第二种模式失败,并且仅打印第一种(
MM/dd/yyyy)。但是
LocalDateTime具有所有时间字段,并且两种模式均有效,因此都用于格式化。
我的结论是:这不是一个通用的解决方案(如Joda-
Time的版本),它更像是一个“幸运的”案例,其中涉及的模式创造了理想的情况。但是我不会在所有情况下都依赖它。
无论如何,如果您仅使用
LocalDate,则可以尝试使用此代码。但是,如果您正在使用其他类型,则可能必须为输出使用 另一个
格式化程序,如下所示:
// parser/formatter for month/day/yearDateTimeFormatter mdy = DateTimeFormatter.ofPattern("MM/dd/yyyy");// parser for both patternsDateTimeFormatter parser = new DateTimeFormatterBuilder() // optional MM/dd/yyyy .appendOptional(mdy) // optional yyyy-MM-dd'T'HH:mm:ss (use built-in formatter) .appendOptional(DateTimeFormatter.ISO_LOCAL_DATE_TIME) // create formatter .toFormatter();// parse MM/dd/yyyyLocalDate d1 = LocalDate.parse("10/16/2016", parser);// parse yyyy-MM-dd'T'HH:mm:ssLocalDate d2 = LocalDate.parse("2016-10-16T10:20:30", parser);// use mdy to formatSystem.out.println(mdy.format(d1));System.out.println(mdy.format(d2));// format object with time fields: using mdy formatter to avoid multiple pattern problemSystem.out.println(mdy.format(LocalDateTime.now()));输出为:
10/16/2016
10/16/2016
06/18/2017



