JavaMessageFormat和LocalDate
我正在使用
MessageFormat.format("Hello {0}", "World"));
现在我想使用LocalDateorLocalDateTime作为参数,但据我所知MessageFormat.format不支持java.time!
所以我必须使用
MessageFormat.format("Today is {0,date}",
Date.from(LocalDate.now().atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()));
这很糟糕!
有没有办法使用更好的方法MessageFormat有java.time?或者是否有更好的解决方案来替换考虑语言环境配置的文本中的占位符?
更新
我知道如何格式化 LocalDate 和 LocalDateTime 但我需要格式化各种类型的消息。
例子
MessageFormat.format("Today is {0,date} {1,number} {2}", aDate, aNumber, aString);
MessageFormatwith java.timeTypes的替代品在哪里?
回答
已经为此打开了一个问题,该问题已解决为“无法修复”。原因是:
该
MessageFormat设计将工作与java.text.Format阶级,所以它使用DateFormat/SimpleDateFormat格式化日期/时间。提供java.time.format.DateTimeFormatter对格式java.time类型 (TemporalAccessors) 的支持可能会使MessageFormatAPI复杂化。始终建议使用java.util.Formatter它提供对格式java.time类型的支持。
所以你应该Formatter改用:
StringBuilder sb = new StringBuilder();
Formatter formatter = new Formatter(sb, Locale.US);
int someNumber = 10;
String someString = "Hello";
formatter.format("Today is %tD and someNumber is %d %s", LocalDate.now(), someNumber, someString);
System.out.println(sb);
// prints "Today is 03/30/21 and someNumber is 10 Hello"
这适用于任何类型的TemporalAccessor.