2015-05-05 5 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) возвращает указанную TimeZone или зону 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

Спасибо! У меня есть еще один вопрос: почему «календарь» имеет такое же значение после инициализации и не обновляет каждое использование, каждый вызов метода getTime()? –

+0

@EdAkhmetshin: «Календарь» - это не только представление календаря, но и мгновенное время, поэтому оно не будет обновляться автоматически. При создании экземпляра будет установлено текущее время. –

+0

У меня нет репутации достаточно для голосования, извините. –

Смежные вопросы