小编典典

如何从语言环境获取当前的时间和时区?

java

我有一个奇怪的问题,当我创建一个具有区域设置的日历时,TimeZone只是还原为本地日历

public void start(Locale locale){
    String s = locale.getDisplayName(); 
    System.err.println(s);
    Calendar c = new GregorianCalendar(locale);
    System.err.println(c.getTimeZone());
}

这是输出:

 español (Argentina)
 sun.util.calendar.ZoneInfo[id="Europe/Bucharest", //etc more useless date here....

如何从特定的语言环境中获取适当的时间?


阅读 222

收藏
2020-09-26

共1个答案

小编典典

简短的答案:您不能。

长话大说:没有“语言环境的正确时区”之类的东西。这仅仅是因为有些国家/地区具有多个时区(例如美国)。时区是一个不同的概念。

无论如何,您正在寻找解决问题的方法。我猜您正在编写Web应用程序,并且看到时区已恢复为服务器默认值。那是典型的情况。双方Locale.getDefault()TimeZone.getDefault()会返回服务器的相关信息。JVM无法知道“适当的”时区。所以你对此能做些什么?

  1. 您可以将时区信息添加到用户配置文件中(如果有的话),或创建时区组合框(以便用户可以在运行时进行切换)。然后,您可以为DateFormat实例分配一个适当的对象,它将自动转换时区。
  2. 您可以通过JavaScript Date Object的getTimezoneOffset()函数从客户端读取 当前 时区偏移,然后以某种方式(AJAX)将其发送到服务器。此方法的问题在于,存在多个具有该偏移量的时区,并且所选时区可能不适用于其他日期。当然,您可以通过轮询时间更改日期附近的数据来猜测时区,但这可能不是您想要的。
  3. 您可以将未格式化的时间发送给客户端(例如,以ISO 8601日期-时间格式或相对于UTC 的纪元Unix时间编写),并为您提供GlobalizeDojo格式的日期和时间。

在这三个可能的选择中,我始终选择数字1。通过将时区信息添加到用户个人资料中,您可以确定他/她的首选时区是什么,而不管其当前的Web浏览器是什么,等等。请记住一些用户可能想在访问其他国家时使用您的应用程序…

2020-09-26