неверное время, отображаемое в поле даты, связанное с часовыми поясами в Blackberry - PullRequest
0 голосов
/ 19 сентября 2011

У меня проблема с обратным отсчетом на основе DateField.

Приложение - установить DateField, включающее значение по умолчанию (10 минут) - получить значение поля, запустить поток и уменьшить значениекаждую секунду - показывать новое значение каждую секунду на экране

Проблема Если у моего симулятора / устройства время по Гринвичу, все работает нормально.Но если я изменю поле даты и на экране результатов отобразится неправильное значение.

Здесь поле даты имеет значение по умолчанию

long time = 1000*60*DEFAULT_PARKING;        
parkingTimePicker = new DateField("",time, DateField.TIME);
TimeZone zone = TimeZone.getTimeZone("GMT");
parkingTimePicker.setTimeZone(zone);

После этого оставшиеся секунды уменьшаются каждую секунду.

Здесь оставшееся время в потоке переводится из секунд назад в чч: мм: сс

public void showTimeLeft()
{             
    private long timeLeft; //time left in Seconds
    private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
    private Date resultdate;
     resultdate = new Date(timeLeft*1000);
     mainScreen.setRemainingTimeLabel(sdf.format(resultdate));
}

Здесь метод, который показывает значение на главном экране

public void setRemainingTimeLabel(String text)
{       
    remainingTimeLabel.setText(text);
    add(new LabelField(System.currentTimeMillis()+""));
    add(new LabelField(text));  
}

IЯ не уверен, где я совершил ошибку, но я уверен, что это связано с Часовой пояс.Как я могу убедиться, что мое приложение работает в разных часовых поясах?

1 Ответ

1 голос
/ 20 сентября 2011

Я полагаю, вы неправильно использовали DateField. Он предназначен для манипуляции с метками времени (которые включают в себя саму дату + время внутри даты). Да, DateField может показывать только временную часть временной метки, однако его конструктор ожидает long, представляющий полную временную метку (обе части: дата + время). Таким образом, передавая long time = 1000*60*DEFAULT_PARKING, какую дату вы проходите? Я бы рекомендовал использовать что-то вроде этого:

int millisSinceMidnight = 1000 * 60 * DEFAULT_PARKING;
// Retrieves date relative to midnight on current day.
Calendar dateCal = DateTimeUtilities.getDate(millisSinceMidnight);
long time = dateCal.getTime().getTime();
parkingTimePicker = new DateField("", time, DateField.TIME);

Неясно, как вы рассчитываете timeLeft. Возможно, опубликуйте код, если проблема все еще присутствует после прочтения / использования этого сообщения.

Я также считаю, что SimpleDateFormat форматирует время, используя текущий часовой пояс устройства. Таким образом, ваш код работает только если часовой пояс устройства GMT. Чтобы обойти это, вы должны удалить это:

TimeZone zone = TimeZone.getTimeZone("GMT");
parkingTimePicker.setTimeZone(zone);

, так что и средство выбора, и средство форматирования работают в одном часовом поясе (текущий на устройстве).

...