如何处理国际时间?

Posted

技术标签:

【中文标题】如何处理国际时间?【英文标题】:how to deal with international time? 【发布时间】:2011-01-31 14:29:21 【问题描述】:

我建立了一个新网站。但主机在美国。我不在美国。 我需要在网站页面上获取时间来与一个本地变量进行比较。 但是因为时差,相差8小时。这个问题怎么解决?

我的代码

SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");  
java.util.Date currentTime = new java.util.Date();  
String dateString = formatter.format(currentTime);  `

如何修改这些代码?

【问题讨论】:

相关:***.com/questions/2532729/… 【参考方案1】:

java.util.Date 不支持时区。您应该通过调用formatter.setTimeZone(tz)TimeZone 传递给格式化程序。

joda-time 在处理日期时被认为是更好的选择。请注意,为了格式化,可以使用Date,但一般建议不要在涉及 i18n 时依赖它。 (请注意那里的许多已弃用的方法)

然后让每个用户设置他的时区。理想情况下建议/假设基于他的浏览器区域设置的时区。 See here

并且始终将日期存储在固定时区 - 最好是 GMT/UTC。

【讨论】:

+1 用于存储 GMT 时间,但 -1 表示不使用 Date。使用Date 没有任何问题,它只是定义了一个时间点。您需要做的就是告诉格式化程序您希望日期格式化的TimeZone @SimonC - 不能使用 Date,因为它使用 JVM 的默认时区。虽然这对于格式化确实很好(通过使用外部格式化程序),但一般建议不要使用它。 @Bozho 为什么说不行?只要您将Date 对象视为自纪元以来的一个简单时间点,并在处理日历或格式化时使用正确的时区,那么您就不会出错。 IE。不要调用toString() 或任何已弃用的方法,例如getHours() @SimonC - 好吧,有许多先决条件是安全的。这就是为什么它很棘手。整个类并没有被弃用,所以我同意它有它的用例,但可能会很棘手。另外,它是可变的。所有这些都导致了 Calendar、DateTime 和即将推出的标准 datetime api 等替代品。 我把“ TimeZone local = TimeZone.getTimeZone("Asia/Tokyo"); Calendar now = Calendar.getInstance(local); SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); String dateString = formatter.format(now.getTime());"【参考方案2】:

为了处理时区,Java 包含了Olson timezone database。在数据库中查找与您处于同一时区的城市。

首先,您需要获取所需时区的TimeZone object。然后,获取带有当前日期和时间(或您希望使用的日期和时间)的Calendar object。您可以使用 SimpleDateFormat 对象对其进行格式化。

TimeZone local = TimeZone.getTimeZone("Asia/Tokyo");
Calendar now = Calendar.getInstance(local); // gets time in the current timezone
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
formatter.setTimeZone(local)

String dateString = formatter.format(now.getTime());

不过,如果您像 Bozho 所说的那样进行大量时间操纵,那就去 joda-time。 Java 日期/时间系统令人困惑且设计不佳。

【讨论】:

我把你的代码放在我的jsp页面中......但是,它不起作用。时间还是和我的当地时间一样..不是“亚洲/东京”时间..为什么? @alex 这是因为我忽略了在格式化程序上设置时区;我已经纠正了。就像我说的那样,它令人困惑且设计不佳;) 只是有点错误.. " formatter.setTimeZone(local);" thx~ 现在一切正常。 :P【参考方案3】:

在这种情况下我总是change timezone in Linux:

mv /etc/localtime  /etc/localtime-backup
ln -sf /usr/share/zoneinfo/Europe/Amsterdam /etc/localtime 

例如,它对于读取日志文件也很有帮助(我总是看到我的本地时间,而不是每次我需要深入研究它们时都计算它)

【讨论】:

【参考方案4】:

我认为您需要使用日历(它们通常比 Date 对象更有用)。如果您创建一个日历,并使用您的语言环境和时区进行初始化,您可以使用您创建的日期执行calendar.setDate()。如果您使用输入的字段创建另一个 Calendar 对象,则可以在两个 Calendar 对象之间进行比较。

【讨论】:

你说“创建一个日历,用你的语言环境和时区初始化”,你能给我一个代码示例吗? 当然,如果您查看文档:download.oracle.com/javase/1.4.2/docs/api/java/util/…, java.util.Locale),您可以使用自己的时区/语言环境构建日历。 对不起,我应该说,你可以得到一个实例,例如:` Calendar myCal = Calendar.getInstance(TimeZone.getTimeZone("Europe/London")); `

以上是关于如何处理国际时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确处理 PHP / MySQL / Apache 中的国际字符

Android国际化多语言切换

windows客户端开发--客户端国际化中特殊处理(日期等)

Spring Boot REST国际化

国际化的程序实现及其原理

2020年自然语言处理重要国际会议时间