如何处理国际时间?
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 中的国际字符