我有一个奇怪的问题,当我创建带有区域设置的日历时,时区只是恢复为本地的
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 无法知道“正确的”时区。那么你能做些什么呢?
- 您可以将时区信息添加到用户配置文件(如果有),或创建时区组合框(以便用户可以在运行时切换)。然后您可以为
DateFormat
实例分配适当的对象,它会自动转换时区。 - 您可以通过 JavaScript 日期对象的 getTimezoneOffset() 从客户端读取当前时区偏移量函数并以某种方式(AJAX)将其发送到服务器。此方法的问题在于,有多个时区具有该偏移量,并且所选时区可能不适合其他日期。当然,您可以通过轮询时间更改日期周围的数据来猜测时区,但这可能不是您想要做的。
- 您可以将未格式化的时间发送给客户端(例如写为 ISO 8601 date-time format 或相对于 UTC 的 Unix time of the epoch)并获得 Globalize或Dojo为您设置日期和时间的格式。
在这三个可能的选择中,我总是选择第 1 个。通过将时区信息添加到用户个人资料中,您可以确定他/她的首选时区是什么,无论他们当前的网络浏览器是什么,等等。请保留请记住,某些用户可能希望在访问其他国家/地区时使用您的应用程序...
关于java - 如何从 Locale 获取当前时间和时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59496946/