2015-05-05 52 views
1

我想创建一个线程,它会每秒在不同区域中写入当前时间。这是我想出的:Java - 不同时区的当前时间

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标准?

谢谢。

+0

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

+0

SimpleDateFormat确实有效。谢谢! –

回答

1

有两个可能的问题。

1.确定时区

TimeZone.getTimeZone("GMT" + belt)返回指定的时区,或GMT区如果给定的ID不能被理解。 [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毫秒。

+0

谢谢!我还有一个问题:为什么'calendar'在初始化后具有相同的值,并且不会更新每个用法,每个'getTime()'方法调用? –

+0

@EdAkhmetshin:'日历'不仅是日历表示,而且是即时的,因此它不会自动更新。在实例化时,当前时间将被设置。 –

+0

我没有足够的投票声望,对不起。 –