Calendar および GregorianCalendar クラスを使用して Android で日付を操作する例を数多く見てきました。最近、Android Developers のTime
ドキュメントで次のことを知りました。
Time クラスは、java.util.Calendar および java.util.GregorianCalendar クラスをより高速に置き換えるものです。Time クラスのインスタンスは、秒の精度で指定された瞬間を表します。
これにより、すべてのカレンダー関数をより高速な Time クラス関数に置き換えるようになりました。
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 プロシージャを 2 回使用する必要があるのはなぜですか?
これは AndroidTime
コード自体 (SDK バージョン 16 を使用) の問題でしょうか?