【问题标题】:Java - current time in different time-zonesJava - 不同时区的当前时间
【发布时间】:2015-05-05 17:29:39
【问题描述】:

我想创建一个线程,每秒将当前时间写入不同区域。这是我想出的:

class TimeThread extends Thread {
    String city;
    String belt;

    public TimeThread(String city, String belt) {
        this.city = city;
        this.belt = belt;
    }

    @Override
    public void run() {
        for (; ; ) {
            String s = Calendar.getInstance(TimeZone.getTimeZone("GMT" + belt)).getTime().toString();
            int i = s.indexOf(":");
            System.out.println(city + ": " + s.substring(i - 2, i + 6));
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

所有线程显示相同的时间。这段代码有什么问题?

顺便问一下,如何使用UTC标准?

谢谢。

【问题讨论】:

  • 您使用calendar.getTime().toString(),它将始终在您的系统时区打印相同的时间 - 因此没有区别。使用像SimpleDateFormat 这样的格式化程序对象并在那里设置时区,然后你会看到不同的本地时间。
  • SimpleDateFormat 确实有效。谢谢!

标签: java time calendar timezone utc


【解决方案1】:

有两个可能的问题。

1.识别时区

TimeZone.getTimeZone("GMT" + belt) 返回指定的时区,如果无法理解给定的 ID,则返回 GMT 时区。 [1] 确保 belt 包含正确的标识符。

2。打印日期

Calendar.getTime() 返回一个表示时间值的日期。该文档没有说明它是否将使用给定的时区或可以使用任何相等的表示。 [2] 因此您应该使用DateFormat 来获取所需的字符串表示。

另一个优点是您不再需要使用substring(..) 操作字符串。

示例代码

TimeZone timezone = TimeZone.getTimeZone("GMT" + belt);
Calendar calendar = Calendar.getInstance(timezone);

DateFormat formatter = new SimpleDateFormat("HH:mm:ss z");
formatter.setCalendar(calendar);
formatter.setTimeZone(timezone);
String s = formatter.format(calendar.getTime());

旁注

请注意,您的代码可能会跳过一秒钟,因为检索时间和格式化它需要时间来运行,因此每次循环迭代将花费超过 1000 毫秒。

【讨论】:

  • 谢谢!我还有一个问题:为什么calendar 在初始化后具有相同的值,并且不会更新每个用法,每个getTime() 方法调用?
  • @EdAkhmetshin: Calendar 不仅是一个日历表示,而且是一个瞬间,因此它不会自动更新。在实例化时,将设置当前时间。
  • 我没有足够的声望投票,对不起。
猜你喜欢
  • 2020-01-18
  • 1970-01-01
  • 2015-03-23
  • 2017-06-07
  • 1970-01-01
  • 2018-09-08
  • 2011-03-15
  • 2017-04-12
  • 1970-01-01
相关资源
最近更新 更多