0

我是android开发的新手,我正在尝试开发一个年龄计算器。使用我当前的代码,我能够正确找到年份和月份之间的差异,但日期不正确。我知道我做错了什么。但我无法弄清楚。我也使用了 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 月 5 日开始。第一个月应该什么时候结束?5.同一日历年的三月?还是在 30 天内?31? 28?29?

在解决逻辑任务之前,您无法解决编程任务。在这里,我们都只能提出一些变体——我们不知道你真正需要什么。

刚才,在你定义任务之前,你不能说你的代码计算正确


正如我可以通过代码猜测的那样,您接受“差异序列”中的月份长度等于“适当”日历月的长度,这个“差异月份”结束。问题是,为了检测月份是否合适,您已经必须知道它的长度。

您必须详细而明确地以人类语言或图表设置计算“不同月份”长度的规则。您的问题是您正试图将非正式术语 - “年龄”形式化。并且不要忘记,即使你发明了一些形式化规则,也不意味着其他人会同意它并且会像你一样感受到它。

你可以很容易地计算一个人生活的整个公历日、月和年。但是不要使用“年龄”这个词,而是三个词:你活了几天,你活了整整几个月,你活了整整年。并做好准备,可能会有超过 12 个月和超过 31 天的时间。但结果将是明确的。

你可以像现在这样计算整年和几个月。但在这种情况下,“年龄”介于 28.Feb 和 28. March 之间。三月将是一个月。你觉得这是一个正确的结果吗?你确定吗?你确定其他人也这么觉得吗?

如果您认为该代码显示了您的内心感受应该如何计算年龄,您可以简单地您计算为“年龄”的内容定义为“年龄”。

编辑:

您在该行中有三个错误

current_Day+=c.getMaximum(dob_Month);

首先,使用 getActualMaximum。其次,你应该取上个月的天。第三,参数应该是 Calendar.Month。

请让这部分代码成为一个函数。计算两个日历日期之差的函数,作为参数给出。您绝对不需要全局字段,这是不好的做法 - 错误被隐藏了。当我使用您的代码时,我将它作为一个函数......并立即发现了错误的行

于 2013-01-11T09:11:49.607 回答
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 计算两个日期之间的差异 也学分转到:http ://tripoverit.blogspot.nl/2007_07_01_archive.html

于 2013-01-11T08:31:25.097 回答
0

实现这一点最直接的方法是以毫秒为单位计算差异,然后向上转换:

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