java - Java MessageFormat 和 LocalDate
问题描述
我正在使用
MessageFormat.format("Hello {0}", "World"));
现在我想使用LocalDate
orLocalDateTime
作为参数,但据我所知MessageFormat.format
不支持java.time
!
所以我必须使用
MessageFormat.format("Today is {0,date}",
Date.from(LocalDate.now().atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()));
这真糟糕!
有没有更好的方法来使用MessageFormat
with java.time
?或者是否有更好的解决方案来替换考虑语言环境配置的文本中的占位符?
更新
我知道如何格式化 LocalDate 和 LocalDateTime 但我需要格式化各种类型的消息。
例子
MessageFormat.format("Today is {0,date} {1,number} {2}", aDate, aNumber, aString);
替换类型MessageFormat
在哪里java.time
?
解决方案
为此打开了一个问题,已解决为“无法修复”。原因是:
MessageFormat
旨在与类一起使用java.text.Format
,因此它使用DateFormat
/SimpleDateFormat
来格式化日期/时间。提供对java.time.format.DateTimeFormatter
格式java.time
类型 (TemporalAccessors
) 的支持可能会使MessageFormat
API 复杂化。始终建议使用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
.
推荐阅读
- python - 了解 EMR 自动缩放
- ruby - ruby 中是否有一个函数可以返回正则表达式匹配后的部分?
- slickgrid - 如何在 angular-slickgrid 中更改分页图标的大小
- c++ - NVidia NSight“进程创建失败”
- php - 用于排序的 orderColumn 在 laravel 中使用的 yajra 数据表中不起作用
- javascript - 表中的 eventlistner 每一行只触发最后一行
- mysql - 我们可以在 MySQL Workbench 中使用 SQL 查询提取存储过程的第二个结果集吗?
- php - 托管 2 个网站的 1 个 IIS 服务器的实体 ID 是什么?
- c# - C# - 如何减少表单的不透明度 onDeactivate 事件
- javascript - 将 Vanilla JS 插入 VueJS 框架