从生日开始计算年龄(以毫秒为单位)

Calculate age from birthday in milliseconds

我知道这里已经解释了采用不同的方法来计算年龄:

但我很想知道为什么我的方法不起作用。我以毫秒为单位获取今天的日期,以毫秒为单位获取用户选择的生日,然后计算年份的差异以获得年龄,但它不准确:

       todayCalender  = Calendar.getInstance()

        val mCustomDatePicker = layoutInflater.inflate(com.example.meet.R.layout.custom_date_picker, activityStageOne, false)

        val mDatePicker = mCustomDatePicker.findViewById(com.example.meet.R.id.mDatePicker) as DatePicker
        mDatePicker.maxDate = (Calendar.getInstance().getTime().getTime())
        val mDialog = AlertDialog.Builder(this)
        mDialog.setView(mCustomDatePicker)

        addListenersForEditText()

        mDialog.setPositiveButton("OK", object : DialogInterface.OnClickListener {
            override fun onClick( dialog: DialogInterface, which: Int) {

                val mCalendar  = Calendar.getInstance()
                mCalendar.set(mDatePicker.year, mDatePicker.month, mDatePicker.dayOfMonth)

                var difference = todayCalender!!.timeInMillis - mCalendar.timeInMillis
                var floating = difference.toFloat()

                Log.d("TAG", (((floating/1000/360/24/60/60))).toString())

                ageET.setText((mDatePicker.month + 1).toString() + " / " + mDatePicker.dayOfMonth.toString() + " / " + mDatePicker.year.toString())
            }

实际计算:

            var difference = todayCalender!!.timeInMillis - mCalendar.timeInMillis
            var floating = difference.toFloat()

            Log.d("TAG", (((floating/1000/360/24/60/60))).toString())

当我 select 将日期设为 2000 年的 1 月 6 日(今天的日期和月份)时,我希望记录“20”(或非常接近 20),但它却记录了 20.29

使用 floor 不是解决方案,因为随着时间的推移,误差会增加,误差可能会超过一年

为什么它不准确?

因为闰年有366天。而平年是365天。我想你用的是 360 天。

只是为了说明使用 java.time 与您已有的代码(假设是一个工作版本)相比,这样的计算可能会变得多么简短和清晰:

fun main() {
    // get the date of birth (maybe from a DatePicker)
    var birthday = java.time.LocalDate.of(2000, 1, 6)
    // calculate the current age (in years only)
    val age = java.time.Period.between(birthday, java.time.LocalDate.now()).getYears()
    // print the result
    println(age)
}

这只是打印 20.

由于您使用的是 DatePicker 和对当天的引用,因此您不必按照毫秒计算任何内容。

考虑使用现代 API,DateCalendar 已经过时,应避免使用。

但是 您支持低于 26 的 API 级别,这导致需要导入 a certain library (its use in Java is explained ) 才能使用 java.time .这是这个的(唯一)缺点...