与Blackberry中的时区相关的日期字段中显示的错误时间

时间:2011-09-19 07:47:24

标签: blackberry java-me timezone datefield

我遇到与基于DateField的倒计时相关的问题。

应用 - 设置一个包含默认值的DateField(10分钟) - 获取字段的值,启动一个线程并每秒减少一次值 - 在屏幕上每秒显示新值

问题 如果我的模拟器/设备是GMT一切正常。但是,如果我更改DateField并且结果屏幕显示错误的值。

此处为Datefield,默认值为

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

之后剩余的秒数每秒都会减少。

此处线程中的剩余时间从秒转换回hh:mm:ss

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));  
}

我不确定我犯了哪个错误,但我很确定它与时区有关。如何确保我的应用程序在不同的时区工作?

1 个答案:

答案 0 :(得分:1)

我相信你误用了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);

所以选择器和格式化程序都在同一时区(设备上的当前)工作。

相关问题