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

标签 java time timezone locale

我有一个奇怪的问题,当我创建带有区域设置的日历时,时区只是恢复为本地的

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. 您可以将时区信息添加到用户配置文件(如果有),或创建时区组合框(以便用户可以在运行时切换)。然后您可以为 DateFormat 实例分配适当的对象,它会自动转换时区。
  2. 您可以通过 JavaScript 日期对象的 getTimezoneOffset() 从客户端读取当前时区偏移量函数并以某种方式(AJAX)将其发送到服务器。此方法的问题在于,有多个时区具有该偏移量,并且所选时区可能不适合其他日期。当然,您可以通过轮询时间更改日期周围的数据来猜测时区,但这可能不是您想要做的。
  3. 您可以将未格式化的时间发送给客户端(例如写为 ISO 8601 date-time format 或相对于 UTC 的 Unix time of the epoch)并获得 GlobalizeDojo为您设置日期和时间的格式。

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

关于java - 如何从 Locale 获取当前时间和时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59496946/

相关文章:

c - 我的跳过列表真的是在 N 而不是 log(N) 中搜索吗?

java - 我正在尝试使用 Java 重命名文件,但由于某种原因它不起作用

java - 'interface'是Java中 'abstract'的限制版本吗?

JAVA:经过这么多时间后中断线程

ruby-on-rails - 如何确定 Date.today 在太平洋时区?

javascript日期问题

Javascript 获取当前日期而不考虑时区

java - 检索类类型,并实例化一个相同类型的新类

java - 从 HTTP Post 接收 XML

Swift:最快日期的特定时间的下一个实例