1

我正在使用ibm 的MessageFormat库来本地化传入日期。

这里的任务是在将日期显示给最终用户之前对其进行一些检查。我得到了一个 ZonedDateTime 对象,我需要确保它不会出现在周末,我使用getDayOfWeek.

当我尝试使用 MessageFormat 将日期转换为字符串时,就会出现问题。由于 MessageFormat 只接受java.util.Date对象,因此我转换了 ZonedDateTime -> Instant-> Date。不幸的是,这种方法导致我的“星期一”变成了“星期日”,如下所示。

我注意到这种“损失”发生在Date转换时。这是因为 MessageFormat 正在调用 Date.toString() 对象,而前者使用 JVM 的默认时区(在我的例子中是 PST)。结果,我的 UTC 被隐式转换为 PST,我损失了一天。

任何想法如何解决这个问题?还有什么可以传递给 MessageFormat 的吗?有没有办法使用 Date 但不会得到这种不受欢迎的行为?我可以使用另一个本地化库吗?

调试时的断点显示不良行为

4

1 回答 1

0

在内部,MessageFormat 使用 DateFormat 对象,但不允许您设置其时区。@Assylias链接了一个问题,其中答案试图提取内部 DateFormat,设置其时区,然后像往常一样使用 MessageFormat,从而解决了问题。

但是,我发现这太罗嗦了,特别是因为您必须每次都创建一个新的 MessageFormat(而不是重用您已经为其设置时区的 MessageFormat)。

我选择的是直接使用 SimpleDateFormat 。

// I have a ZonedDateTime zonedDateTime that I want to print out.
final SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE, MM dd", locale);
dateFormat.setTimeZone(TimeZone.getTimeZone(zonedDateTime.getZone()));
final String formattedDateString = dateFormat.format(Date.from(zonedDateTime.toInstant()));

然后我使用 String.format 将我的格式化日期插入到一个更大的字符串中。希望这可以帮助。

于 2020-06-23T06:26:34.860 回答