我在用
MessageFormat.format("Hello {0}", "World"));现在我想使用LocalDate或LocalDateTime作为参数,但据我所知,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);用MessageFormat类型替换java.time在哪里?
发布于 2021-03-30 14:41:45
我终于找到了一个关于在java.time中支持MessageFormat的bug报告。
https://bugs.openjdk.java.net/browse/JDK-8254654
在这个问题解决之前,我将使用建议的解决方法,并将LocalDate等转换为java.util.Date。
发布于 2021-03-30 12:11:54
为此打开了一个问题,它被解析为“不会修复”。原因是:
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。
发布于 2021-08-02 15:45:13
MessageFormat允许为任何参数创建和设置自定义格式。
val randomDate = LocalDate.EPOCH.plusDays(random.nextInt(20_000));
val fmt = new MessageFormat("Today is {0}");
fmt.setFormat(0, new SummaryDateFormat());
val out = fmt.format(new Object[]{randomDate});
System.out.println(out);以下是您的自定义格式的示例实现:
public class SummaryDateFormat extends Format {
@Override
public StringBuffer format(final Object obj, final StringBuffer toAppendTo, final FieldPosition pos) {
toAppendTo.append(String.format("%tA, %<tB %<te", obj));
return toAppendTo;
}
@Override
public Object parseObject(final String source, final ParsePosition pos) {
return null;
}
}https://stackoverflow.com/questions/66870234
复制相似问题