Create java.util.Date from C# System.TimeZone



我有一个Java服务,它需要返回相对于用户当前时区(C#)格式化的日期/时间信息。例如,假设用户在西海岸(太平洋时间),时间是晚上8:00。他们连接到一个在中西部(中部时间)晚上10:00托管的服务。如果用户要向服务器询问当前时间,服务器应该为用户回复"8:00 pm"。

我的想法是,客户端应用程序(C#)将向服务传递有关其当前时区或UTC偏移的信息。Java将使用该时区创建/格式化所有日期。

然而,我很难找到一种好的方法来传递C#System.TimeZone信息,使Java能够创建和使用java.util.TimeZone对象。我可以从C#中得到UTC偏移量,但不能得到三位数的时区代码。在Java中,我可以用三位数的代码创建时区,但找不到用UTC偏移量创建时区的方法。从我在Java中看到的一切来看,时区是用代码("PST")或国家/地区("America/Loss_Angeles")创建的,我不相信有一种明确的方法可以在C#中获得这种格式的时区。

如何才能做到这一点?

在UTC工作

正如评论所建议的,通常最好的方法是在UTC中运行您的业务逻辑。调整到本地时区,仅在用户期望时进行演示。

因此,您的Java后端应该返回UTC日期时间值。通常,最好的方法是将日期时间值序列化为标准ISO8601格式的字符串。然后,让客户端应用程序通过生成调整到特定时区的日期-时间值的字符串表示来处理演示。

请参阅此问题,了解日期时间工作的最佳实践。

但不知何故,这在这个问题的背景下是不可行的。因此,客户端应用程序需要与后端通信所需/预期的时区。

时区

避免使用3-4个字母的代码,如ESTIST。这些代码既不是标准化的,也不是唯一的。此外,他们以一种令人困惑的方式调用夏令时。

而是使用官方时区名称。这些大多采用英语中的"大陆"、斜线和"地区/城市"的格式,如America/MontrealAsia/Kolkata

.Net无法支持正确的时区命名

不幸的是,.Net团队似乎不知道正确的时区命名。

System.TimeZone类提供了诸如StandardName之类的属性。但System.TimeZone文档中的示例显示的是"太平洋标准时间",而不是诸如"America/Loss_Angeles"之类的专有名称。

Noda时间

我的第一个建议是考虑使用Noda Time项目,这是.NET的一个替代日期和时间API。它的灵感来自于Java中非常成功的Joda-Time库,这反过来又激发了Java 8及更高版本中内置的新Java.Time框架。

看起来Noda Time支持适当的时区。不使用System.TimeZone,而是使用Noda Time来获取时区信息。

滚动您自己的映射

如果Noda Time不是一个选项,那么我可能会看看我的用户是否都在几个时区。如果是这样的话,我会制作我自己的地图,比如C#返回的"太平洋夏令时",作为时区的标准名称,即正确的名称"America/Los_Angeles"。

最新更新