我见过很多在 Android 中使用 Calendar 和 GregorianCalendar 类处理日期的例子。Time
最近我在 Android Developers文档中遇到了以下内容:
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 时间对象中设置日期值:
currentTime.set(dayOfMonth, monthOfYear, year);
currentTime.set(currentTime.toMillis(true));
mPickDate.setText(currentTime.format("%A, %d %b %Y"));
我的问题是:为什么必须在上述 DatePickerDialog.OnDateSetListener 代码中使用 currentTime.set 过程两次,才能正确显示星期几字符串?
这可能是 AndroidTime
代码本身的问题(使用 SDK 版本 16)吗?