首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java MessageFormat和LocalDate

Java MessageFormat和LocalDate
EN

Stack Overflow用户
提问于 2021-03-30 11:35:30
回答 3查看 1.1K关注 0票数 8

我在用

代码语言:javascript
复制
MessageFormat.format("Hello {0}", "World"));

现在我想使用LocalDateLocalDateTime作为参数,但据我所知,MessageFormat.format不支持java.time

所以我不得不用

代码语言:javascript
复制
MessageFormat.format("Today is {0,date}", 
              Date.from(LocalDate.now().atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()));

这太可怕了!

是否有更好的方法将MessageFormatjava.time结合使用?或者是否有更好的解决方案来替换考虑区域设置的文本中的占位符?

更新

我知道如何格式化LocalDate和LocalDateTime,但是我需要用不同的类型格式化消息。

示例

代码语言:javascript
复制
MessageFormat.format("Today is {0,date} {1,number} {2}", aDate, aNumber, aString);

MessageFormat类型替换java.time在哪里?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-30 14:41:45

我终于找到了一个关于在java.time中支持MessageFormat的bug报告。

https://bugs.openjdk.java.net/browse/JDK-8254654

在这个问题解决之前,我将使用建议的解决方法,并将LocalDate等转换为java.util.Date

票数 3
EN

Stack Overflow用户

发布于 2021-03-30 12:11:54

为此打开了一个问题,它被解析为“不会修复”。原因是:

MessageFormat是为处理java.text.Format类而设计的,因此它使用DateFormat/SimpleDateFormat格式化日期/时间。提供对java.time.format.DateTimeFormatter格式java.time类型(TemporalAccessors)的支持可能会使MessageFormat API复杂化。建议始终使用java.util.Formatter,它提供了对格式化java.time类型的支持。

因此,您应该使用Formatter来代替:

代码语言:javascript
复制
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

票数 10
EN

Stack Overflow用户

发布于 2021-08-02 15:45:13

MessageFormat允许为任何参数创建和设置自定义格式。

代码语言:javascript
复制
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);

以下是您的自定义格式的示例实现:

代码语言:javascript
复制
 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;
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66870234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档