Java 如何处理国际时间?

Java 如何处理国际时间?,java,jsp,timezone,Java,Jsp,Timezone,我建立了一个新网站。但是主持人在美国。我不在美国。 我需要在网站页面上获得与一个局部变量进行比较的时间。 但是由于时差的原因,它有8个小时的时间差。如何解决这个问题 我的代码 SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); java.util.Date currentTime = new java.util.Date(); String dateString = formatter.format(current

我建立了一个新网站。但是主持人在美国。我不在美国。 我需要在网站页面上获得与一个局部变量进行比较的时间。 但是由于时差的原因,它有8个小时的时间差。如何解决这个问题

我的代码

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

如何修改这些代码?

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

在处理日期时,被认为是更好的选择。请注意,为了格式化,可以使用
Date
,但对于i18n,一般建议不要依赖它。(注意这里有许多不推荐使用的方法)

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

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

在这种情况下,我始终:


例如,它也有助于读取日志文件(每次需要深入查看日志文件时,我总是查看本地时间,而不是计算本地时间)

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

为了处理时区,Java包括。在数据库中查找与您所在时区相同的城市

首先,你需要得到一个你想要的时区。然后,获取包含当前日期和时间(或您希望使用的日期和时间)的。您可以使用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());

不过,如果你像波佐说的那样大量操纵时间,那就选择乔达时间。Java日期/时间系统令人困惑,而且设计得相当糟糕。

相关:+1表示以GMT存储时间,而-1表示不使用
date
。使用
日期
没有什么错,它只是定义了一个时间点。您所需要做的就是告诉格式化程序您希望在哪个时区格式化日期。@SimonC-使用日期是不合适的,因为它使用JVM的默认时间节点。虽然这对于格式化(通过使用外部格式化程序)来说确实很好,但一般建议不要使用它。@Bozho你为什么说它不好?只要将
Date
对象视为自历元以来的一个时间点,并在处理日历或格式时使用正确的时区,就不会出错。也就是说,不要调用
toString()
或任何不推荐使用的方法,如
getHours()
@SimonC-好吧,有许多先决条件是安全的。这就是为什么它很棘手。整个类还没有被弃用,所以我同意它有它的用例,但可能很棘手。另外,它是可变的。所有这些都导致了诸如Calendar、
DateTime
和即将推出的标准DateTime api之类的替换。我把“TimeZone local=TimeZone.getTimeZone(“亚洲/东京”);Calendar now=Calendar.getInstance(本地);SimpleDateFormat formatter=new SimpleDateFormat(“HH:mm:ss”);String dateString=formatter.format(now.getTime());你说“创建一个日历,用你的区域设置和时区初始化”,你能给我一个代码示例吗?当然,如果你看文档:,java.util.locale),你可以用你自己的时区/区域设置构建一个日历。对不起,我应该说,你可以得到一个实例,例如:`Calendar myCal=Calendar.getInstance(timezone.getTimeZone(“Europe/London”))59426;“thx~现在一切都好了。:P
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());