0

我有一个与基于 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));  
}

我不确定我在哪里犯了错误,但我很确定它与时区有关。如何确保我的应用在不同的时区运行?

4

1 回答 1

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

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

于 2011-09-19T20:22:31.927 回答