Java Date-toString不带MessageFormat的时区转换

Java Date-toString不带MessageFormat的时区转换,java,date,messageformat,Java,Date,Messageformat,我正在使用库对传入日期进行本地化 这里的任务是在向最终用户显示日期之前对日期进行一些检查。我得到一个ZonedDateTime对象,我需要确保它不会在周末落下,这是我使用getDayOfWeek实现的 当我尝试使用MessageFormat将日期转换为字符串时,就会出现问题。由于MessageFormat只接受java.util.Date对象,因此我转换我的ZonedDateTime->Instant->Date。不幸的是,这种方法导致我的“星期一”变成了“星期天”,如下所示 我注意到这种“损失

我正在使用库对传入日期进行本地化

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

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

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

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


在内部,MessageFormat使用DateFormat对象,但不允许您设置其时区@Assylias,其中答案尝试提取内部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()));

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

在内部,MessageFormat使用DateFormat对象,但不允许您设置其时区@Assylias,其中答案尝试提取内部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()));

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

日期本身是正确的。它只是在PST中打印,因为
Date
类的
toString()
方法将使用本地时区打印它。@HariMenon right,但这意味着我的最终用户看到的是“星期天”而不是“星期一”,因为MessageFormat将使用转换后的日期。我基本上总是在这种隐性转化中损失一天的时间将所需的时区应用于基础SimpleDataFormat。我认为Date不允许这样做。查看MessageFormatter文档,您可以指定格式字符串以根据需要对其进行格式设置,就像argStyleText可以接受任何SimpleDataFormat一样。因此,您可以更改格式化程序的格式string@HariMenon我认为传递argStyleText将导致MessageFormatter也将其传递给其底层SimpleDataFormat。这里的问题是,这个底层SimpleDataFormat不会使用我想要的时区。我真正想要的是在SimpleDateFormat上设置时区。assylias的建议看起来不错,但它太冗长了,无法继续循环使用MessageFormat中的所有SimpleDataFormat,尤其是在建议每次实例化一个新的SimpleDataFormat时。我现在最好的选择是直接使用SimpleDataFormat。让我看看它是否提供了我想要的本地化。日期本身是正确的。它只是在PST中打印,因为
Date
类的
toString()
方法将使用本地时区打印它。@HariMenon right,但这意味着我的最终用户看到的是“星期天”而不是“星期一”,因为MessageFormat将使用转换后的日期。我基本上总是在这种隐性转化中损失一天的时间将所需的时区应用于基础SimpleDataFormat。我认为Date不允许这样做。查看MessageFormatter文档,您可以指定格式字符串以根据需要对其进行格式设置,就像argStyleText可以接受任何SimpleDataFormat一样。因此,您可以更改格式化程序的格式string@HariMenon我认为传递argStyleText将导致MessageFormatter也将其传递给其底层SimpleDataFormat。这里的问题是,这个底层SimpleDataFormat不会使用我想要的时区。我真正想要的是在SimpleDateFormat上设置时区。assylias的建议看起来不错,但它太冗长了,无法继续循环使用MessageFormat中的所有SimpleDataFormat,尤其是在建议每次实例化一个新的SimpleDataFormat时。我现在最好的选择是直接使用SimpleDataFormat。让我看看它是否提供了我想要的本地化。如果您是手动格式化日期,为什么不使用DateTimeFormatter?不再需要时区转换
String formatted=DateTimeFormatter.ofPattern(“EEEE,MM,dd”,Locale.UK).format(zonedDateTime)
如果要手动格式化日期,为什么不使用DateTimeFormatter?不再需要时区转换
String formatted=DateTimeFormatter.of模式(“EEEE,MM,dd”,Locale.UK)。格式(zonedDateTime)