我见过很多使用Calendar和GregorianCalendar类在Android中使用日期的例子。
最近,我在Android开发者Time
文档中遇到了以下内容:
Time类是java.util.Calendar和java.util.GregorianCalendar类的更快替代品。 Time类的实例表示一个时刻,以第二精度指定。
这促使我用更快的Time类函数替换所有Calendar函数。
以下是我读取存储在SQLite数据库中的日期的代码:
// extract milliseconds (long) value from SQLite database
Long timeLong = note.getLong(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_DATE));
Time currentTime.set(timeLong);
以下是用于填充日期选择器并在mPickDate按钮中显示格式化日期字符串的整数值的部分代码:
mDay = currentTime.monthDay; // Day of the month (0-31)
mMonth = currentTime.month; // Month (0-11)
mYear = currentTime.year; // Year
mPickDate.setText(currentTime.format("%A, %d %b %Y")); // using strftime equivalent to dateFormat = new SimpleDateFormat("E, dd MMM yyyy");
请注意格式%A用于获取星期几的长字符串。 这部分格式化代码运行良好,并显示格式化日期的正确字符串,包括正确的星期几。
单击mPickDate按钮可调用DatePicker小部件,该小部件允许更改和设置新日期。
以下代码显示了从DatePicker处理新选择的日期:
private DatePickerDialog.OnDateSetListener mDateSetListener =
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// new method using Time class
currentTime.set(dayOfMonth, monthOfYear, year);
mPickDate.setText(currentTime.format("%A, %d %b %Y"));
// old method using GregorianCalendar class
//mCalendar = new GregorianCalendar(year, monthOfYear, dayOfMonth);
//mPickDate.setText(dateFormat.format(mCalendar.getTime()));
}
};
mPickDate按钮获取显示的正确日期字符串,如日期选择器中所选,除了星期几(%A),它始终显示为星期日。为什么?
请注意,mPickDate.SetText代码与先前用于格式化从SQLite数据库字段中提取的按钮日期字符串的代码相同。
我不得不修改上面的代码,通过添加额外的代码行来再次在currentTime Time对象中设置日期值:
currentTime.set(dayOfMonth, monthOfYear, year);
currentTime.set(currentTime.toMillis(true));
mPickDate.setText(currentTime.format("%A, %d %b %Y"));
我的问题是:为什么有必要在上面的DatePickerDialog.OnDateSetListener代码中使用currentTime.set过程两次,以便正确显示星期几字符串?
这可能是Android Time
代码本身(使用SDK版本16)的问题吗?