1

Android 用の CalendarDisplay アプリケーションを作成しています。とりわけ、このアプリケーションでは、ユーザーがエポック (エポックは 1899 年の日付) に追加する日数を選択でき、その結果がディスプレイにグラフィカルに表示されます。ただし、カレンダーの値から日付の値を設定すると、予期しない結果が得られます。年は 1900 の値だけずれているようです。結果に 1900 を単純に追加することはできますが、私が行っていることから、それは間違った答えのように思えます。本によると(私は信じています)。または、私が持っているものを続けることもできます。それも機能します。しかし、それは同じ書籍の問題を共有しています。デバッグ用のスペア変数を含むコードは次のとおりです。

public void gotoCal(int days) {
    // epochCal has been initialized as follows:
    // (HYF_BASE_YEAR = 1899,  HYF_BASE_MONTH = 11, HYF_BASE_DAY = 1)
    // epochCal = (Calendar) Calendar.getInstance();
    // epochCal.set(HYF_BASE_YEAR, HYF_BASE_MONTH, HYF_BASE_DAY);

    Calendar cal = (Calendar) epochCal.clone();
    cal.add(Calendar.DATE, days);
    int year = cal.get(Calendar.YEAR);
    Date date = cal.getTime();
    int year2 = date.getYear();
    if (year2 != year) {
        date.setYear(year);
    }
    int year3 = date.getYear();
    gotoDate(date);
}

ここで、このコードをデバッグ モードで gotoCal(40000) として実行し、gotoDate() 行にブレークポイントを設定すると、次の値がフィールドに表示されます: year = 2009 、 year2 = 109 、 year3 = 2009

Calendar.getTime() 関数は1900 年前の日付を返すことになっていますか (そのようなドキュメントは見たことがありません)。それとも、それを行うために影響を与えるために何かをしている可能性がありますか? または、他に何が間違っているのでしょうか?

4

2 に答える 2

6

のドキュメントを読み間違えた (または読んでいない) Date.getYear:

ローカル タイム ゾーンで解釈された、この Date オブジェクトで表される時点を含む、または開始する年から 1900 を引いた値を返します。

また:

  • Date.getYearは非推奨であり、正当な理由があります。デフォルトのタイムゾーンを使用するため、基本的に使用しないでください。

  • Joda Time、はるかに優れた日付と時刻の API です。Date/の代わりにそれを使用することを強くお勧めしCalendarます。

于 2011-08-13T15:55:49.093 に答える
0

Androidエミュレーターでこの問題を修正するために、次のことを行いました。

private Date insuranceExpiryDate = new Date(Calendar.getInstance().getTime().getTime());
private int mYear, mMonth, mDay ;

私のonCreateで

Calendar c = Calendar.getInstance() ;
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH);
day = c.get(Calendar.DAY_OF_MONTH);
insuranceExpiryDate.setYear(year) ;
insuranceExpiryDate.setMonth(month) ;
insuranceExpiryDate.setDate(day);

私のonCreateDialogで

case INSURANCE_EXPIRY:
changeInsuranceExpiryDialog = new DatePickerDialog(this,
    new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(
        DatePicker changeInsuranceDatePicker, int year,
            int month, int day) {
                god.updateDisplay(changeInsuranceExpiryDate,
                insuranceExpiryDate, year, month, day);
        }
    }, mYear, mMonth, mDay);
于 2012-07-07T17:17:25.223 に答える