有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Date-toString不带MessageFormat时区转换

我正在使用ibm's ^{}库对传入日期进行本地化

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

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

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

有没有办法解决这个问题?还有什么我可以传递给MessageFormat的吗?有没有一种方法可以使用Date,但不能获得这种不希望的行为?是否还有其他本地化库可供我使用

Breakpoint when debugging shows the undesired behavior


共 (1) 个答案

  1. # 1 楼答案

    在内部,MessageFormat使用DateFormat对象,但不允许您设置其时区@Assyliaslinked a question其中答案尝试提取内部DateFormat,设置其时区,然后像往常一样使用MessageFormat,从而解决问题

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

    我选择的是直接使用SimpleDataFormat

    // 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()));
    

    然后我使用字符串。format可将我的格式化日期插入到较大的字符串中。希望这有帮助