如何从Locale获取当前时间和时区?

我有这个奇怪的问题,当我创建一个带语言环境的日历时,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.... 

如何从特定区域获得适当的时间?

简短的回答:你做不到。

答案很长:没有“适合当地的时区”这样的事情。 这只是因为有一些国家有多个时区(例如美国)。 时区是一个不同的概念。

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

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

在这三种可能的选择中,我总是选择数字1.通过将时区信息添加到用户个人资料中,您可以确定他/她的首选时区是什么,无论他们当前的网络浏览器等等。请记住,一些用户可能希望在访问其他国家时使用您的应用程序…