我遇到与基于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));
}
我不确定我犯了哪个错误,但我很确定它与时区有关。如何确保我的应用程序在不同的时区工作?
答案 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);
所以选择器和格式化程序都在同一时区(设备上的当前)工作。