首页 > 解决方案 > Java MessageFormat 和 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()));

这真糟糕!

有没有更好的方法来使用MessageFormatwith java.time?或者是否有更好的解决方案来替换考虑语言环境配置的文本中的占位符?

更新

我知道如何格式化 LocalDate 和 LocalDateTime 但我需要格式化各种类型的消息。

例子

MessageFormat.format("Today is {0,date} {1,number} {2}", aDate, aNumber, aString);

替换类型MessageFormat在哪里java.time

标签: java

解决方案


为此打开了一个问题,已解决为“无法修复”。原因是:

MessageFormat旨在与类一起使用java.text.Format,因此它使用DateFormat/SimpleDateFormat来格式化日期/时间。提供对java.time.format.DateTimeFormatter格式java.time类型 ( TemporalAccessors) 的支持可能会使MessageFormatAPI 复杂化。始终建议使用java.util.Formatter提供格式java.time类型支持的 which。

所以你应该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.


推荐阅读