从生日开始计算年龄(以毫秒为单位)
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,Date
和 Calendar
已经过时,应避免使用。
但是 您支持低于 26 的 API 级别,这导致需要导入 a certain library (its use in Java is explained ) 才能使用 java.time
.这是这个的(唯一)缺点...
我知道这里已经解释了采用不同的方法来计算年龄:
但我很想知道为什么我的方法不起作用。我以毫秒为单位获取今天的日期,以毫秒为单位获取用户选择的生日,然后计算年份的差异以获得年龄,但它不准确:
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,Date
和 Calendar
已经过时,应避免使用。
但是 您支持低于 26 的 API 级别,这导致需要导入 a certain library (its use in Java is explained java.time
.这是这个的(唯一)缺点...