2013-01-11 16 views
0

我是新開發的Android開發人員,我正在嘗試開發一個年齡計算器。用我目前的代碼,我可以正確地找到年份和月份之間的差異,但這些日子並不正確。我知道我做錯了什麼。但我無法弄清楚。 我也使用了jodatime api,但是當我使用它時,我的應用程序關閉了,當我調用這個函數時,我無法理解我做錯了什麼。 我的代碼是:無法在我的Android時代計算器應用程序代碼中拆分幾個月和幾天

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_變量從日期選擇器獲取它們的值。

回答

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; 
} 

而且下面也許有趣的閱讀:how to calculate difference between two dates using java 還稱讚到:http://tripoverit.blogspot.nl/2007_07_01_archive.html

+0

他的代碼計算天**等價於你的**,並且更短(我的意思是它的「天」部分是) 。這些鏈接不適合這裏。他不計算差異,但用三個數字--y-m-d表示。這裏是問題 – Gangnus

+0

先生你的功能我得到8973天,如果startDate = 24/05/1988和endDate = 11/01/2013這是不正確的,如果我比較這個結果與勝7內置計算器的結果是8998天。實際上我想要我的結果像24年7個月18天。從我的代碼我發現24年7個月7天。那幾天沒有好轉。 – Teji

0

最直接的方式實現這一目標是計算的差異毫秒然後轉換爲:

long Milli=(EndDate.getTime() - startDate.getTime()); 
long Seconds=Milli/1000; 
long Days = Seconds/60L/60L/24L; 
+0

他想要以年 - 月 - 日的形式出現差異,而不是隻有幾天。 – Gangnus

+0

是@Gangnus我想要我的結果像24年7個月18天 – Teji

1

首先,您應該以正確的方式設置任務。定義,這些「日子」是什麼意思。顯然,你想在年 - 月 - 日的形式中獲得日期差異。 只有幾天的差異可以很容易地計算 - 以秒爲單位的時間戳的差異,並將其除以24 * 3600。

現在您需要從中減去整個月份和年份中的天數。但他們的長度(全年和非洲的)有所不同。應該採取什麼樣的長度?日曆月份的長度根據日曆設置。但是,這個差異的幾個月沒有與任何日曆綁定在一起。例如,第一個日期和第一個月的差異從5.Feb開始。這個第一個月應該何時結束? 5.同一歷年的3月份?或在30天內? 31? 28? 29?

解決邏輯任務之前,您無法解決編程任務之前。在這裏,我們都只能提出一些變體 - 我們不知道你真的需要什麼。

剛纔,在您定義任務之前,您不能說您的代碼正確計數什麼東西


正如我可以由代碼猜測,您接受在「差序列」等於「適當的」日曆月的長度月份的長度,即在這個「差結束月」。問題是,爲了檢測月份是否合適,你必須知道它的長度。

你必須詳細,明確,並在人類的語言或圖表設置規則的「不同月份」的長度應計算。你的問題是,你正試圖將非正式的術語 - 「年齡」變成最大化。不要忘記,即使你會發明一些規範化的規則,但並不意味着其他人會同意它,並會像你一樣感受到它。

你可以很容易地計算一個人住的整個canendar天,月和年。但是,不要使用「年齡」一詞,而要使用三個詞:你住的日子,你住的整個月,你住的整整一年。並做好準備,可能會有超過12個月和超過31天。但結果將是毫不含糊

你可以像現在這樣計算整年和月份。但在這種情況下,28。28日至28日之間的「年齡」將是一個月。你覺得這是一個正確的結果嗎?你確定?你確定其他人都這麼認爲嗎?

如果您認爲代碼顯示您的內心情緒應如何計算年齡,您可以簡單地定義您計算的「年齡」。

編輯:

你在該行

current_Day+=c.getMaximum(dob_Month); 

首先有三個錯誤,請使用getActualMaximum。其次,您應該獲取之前的月份的天數。第三,參數應該是Calendar.Month。

而且,請使這部分代碼成爲一個函數。計算兩個日曆日期之間差異的函數,以參數形式給出。你在全球領域絕對沒有必要,這是不好的做法 - 錯誤隱藏起來。當我使用你的代碼時,我將它作爲一個函數......並且立刻發現了錯誤的行

+0

老闆jst告訴我在我的邏輯問題。我希望我的結果能像1988年5月24日至2013年1月11日的24年7個月18天。從我的代碼我有7天。請告訴我的邏輯。 – Teji

+0

Ahem。這是**你**誰應該設置任務。它尚未定義。我看到的唯一任務就是你的代碼。順便說一句,我看到,在你的例子中,它給出了你需要的完整的18天,而不是7你在某個地方做了一個錯誤。把這個例子也放在這個問題上。 – Gangnus

+0

請先檢查現在的代碼。 – Teji

相關問題