0

私はアンドロイド開発が初めてで、年齢計算機を開発しようとしています。私の現在のコードでは、年と月の違いを正しく見つけることができますが、日は正しくありません。私は何か間違ったことをしていることを知っています。しかし、私はそれを理解することができません。私もjodatime apiを使用しましたが、使用すると、この関数を呼び出すとアプリが閉じられ、何が間違っているのか理解できません。私のコードは次のとおりです。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         mDateDisplay = (TextView) findViewById(R.id.showMyDate);        
            mPickDate = (Button) findViewById(R.id.myDatePickerButton);

            mPickDate.setOnClickListener(new View.OnClickListener() {
                @SuppressWarnings("deprecation")
                public void onClick(View v) {
                    showDialog(DATE_DIALOG_ID);
                }
            });

            dob_Year = c.get(Calendar.YEAR);
            dob_Month = c.get(Calendar.MONTH);
            dob_Day = c.get(Calendar.DAY_OF_MONTH);
// display the current date
            updateDisplay();
                }

    private void updateAge()
    {
        current_Year = c.get(Calendar.YEAR);
        current_Month = c.get(Calendar.MONTH);
        current_Day = c.get(Calendar.DAY_OF_YEAR);

        if (current_Day < dob_Day) {
            current_Month--;

            current_Day+=c.getMaximum(dob_Month);
           }
if (current_Month < dob_Month) {
            current_Year--;
            current_Month += 12;
        }
int ageYear=current_Year-dob_Year;
int ageMonths=current_Month-dob_Month;
int ageDays= current_Day-dob_Day;
 this.mAgeDisplay.setText(
                new StringBuilder()

                        .append(ageYear).append(" Years ")
                        .append(ageMonths).append(" Months ")
                        .append(ageDays).append(" Days "));
    }

    private void updateDisplay() {
        this.mDateDisplay.setText(
            new StringBuilder()
                    // Month is 0 based so add 1
                    .append(dob_Day).append("-")
                    .append(dob_Month + 1).append("-")
                    .append(dob_Year).append(" "));
    }
    private DatePickerDialog.OnDateSetListener mDateSetListener =
            new DatePickerDialog.OnDateSetListener() {
                public void onDateSet(DatePicker view, int year, 
                                      int monthOfYear, int dayOfMonth) {
                    dob_Year = year;
                    dob_Month = monthOfYear;
                    dob_Day = dayOfMonth;
                    updateDisplay();
                    updateAge();
                }
            };
            @Override
            protected Dialog onCreateDialog(int id) {
               switch (id) {
               case DATE_DIALOG_ID:
                  return new DatePickerDialog(this,
                            mDateSetListener,
                            dob_Year, dob_Month, dob_Day);
               }
               return null;
            }

このコード フラグメントでは、dob_ 変数が datepicker から値を取得します。

4

3 に答える 3

1

まず、タスクを正しい方法で設定する必要があります。これらの「日」とはどういう意味ですか。明らかに、日付の差を年-月-日の形式で取得する必要があります。日数の差は簡単に数えることができます。タイムスタンプの差を秒単位で取り、24*3600 で割ります。

ここで、月と年全体の日数をそれから差し引く必要があります。しかし、それらの長さ (年全体と 2 月) は異なります。どのくらいの長さを取るべきですか?暦月の長さは、暦に従って設定されます。しかし、その違いの月は、どのカレンダーにも関連付けられていません。たとえば、最初の日付と差額の最初の月は 2 月 5 日から始まります。この最初の月はいつ終わりますか? 5.同暦の3月?それとも30日後?31? 28? 29?

論理タスクを解決するにプログラミング タスクを解決することはできません。ここでは、いくつかのバリエーションを提案することしかできません。本当に必要なものはわかりません。

タスクを定義する前は、コードが正しくカウントされているとは言えませ


コードから推測できるように、「差分シーケンス」の月の長さを、この「差分月」で終わる「適切な」暦月の長さと同じとして受け入れています。問題は、月が適切かどうかを検出するために、その月の長さを知っている必要があることです。

詳細かつ明示的に人間の言葉または図で、「異なる月」の長さをカウントするルールを設定する必要があります。あなたの問題は、「年齢」という非公式の用語を形式化しようとしていることです。そして忘れてはいけないのは、形式化のルールを発明したとしても、他の人がそれに同意し、あなたと同じように感じるとは限らないということです。

人が住んでいた日、月、年全体を簡単に数えることができます。ただし、「年齢」という用語は使用せず、3 つの用語を使用します: 生きた日数、生きた月数、生きた年数です。そして、12 か月以上、31 日以上になる可能性があることに備えてください。しかし、結果は明白です。

今と同じように、年と月全体を数えることができます。ただし、この場合、「年齢」は 28.Feb から 28.3 月の間で 1 か月になります。正しい結果だと感じますか?本気ですか?他の人がそう感じていると確信していますか?

また、コードが年齢のカウント方法を示していると思われる場合は、単に「年齢」としてカウントするものを定義できます。

編集:

行に 3 つのエラーがあります

current_Day+=c.getMaximum(dob_Month);

まず、getActualMaximum を使用します。次に、前月の日数を取得する必要があります。3 番目に、引数は Calendar.Month にする必要があります。

そして、コードのこの部分を関数にしてください。パラメーターとして指定された 2 つのカレンダー日付の差をカウントする関数。グローバルフィールドはまったく必要ありません。これは悪い習慣です。エラーが隠されます。私があなたのコードで作業したとき、私はそれを関数として作成しました...そしてすぐに間違った行を見つけました

于 2013-01-11T09:11:49.607 に答える
0

これを実現する最も直接的な方法は、差をミリ秒単位で計算してから変換することです。

long Milli=(EndDate.getTime() - startDate.getTime());
long Seconds=Milli/1000; 
long Days = Seconds/60L/60L/24L;
于 2013-01-11T08:39:03.367 に答える
0

たぶん、この機能が役立ちます:

public static long daysBetween(Calendar startDate, Calendar endDate) {  
  Calendar date = (Calendar) startDate.clone();  
  long daysBetween = 0;  
  while (date.before(endDate)) {  
    date.add(Calendar.DAY_OF_MONTH, 1);  
    daysBetween++;  
  }  
  return daysBetween;  
}  

また、次の記事も興味深いかもしれません: Java使用して 2 つの日付の差を計算する方法

于 2013-01-11T08:31:25.097 に答える