I\'m new to Android programming and I\'m currently developing an app. Can someone help me on how to validate the date that is being input by the user if is it valid or not?<
I did it for MM/dd/yyyy
format with Kotlin.
fun validateDate(date: String): Boolean {
val regex = "^(0[0-9]||1[0-2])/([0-2][0-9]||3[0-1])/([0-9][0-9])?[0-9][0-9]$"
val matcher = Pattern.compile(regex).matcher(date)
return if (matcher.matches()) {
matcher.reset()
if (matcher.find()) {
val dateDetails = date.split("/")
val day: String = dateDetails[1]
val month: String = dateDetails[0]
val year: String = dateDetails[2]
if (validateMonthWithMaxDate(day, month)) {
false
} else if (isFebruaryMonth(month)) {
if (isLeapYear(year)) {
leapYearWith29Date(day)
} else {
notLeapYearFebruary(day)
}
} else {
true
}
} else {
false
}
} else {
false
}
}
private fun validateMonthWithMaxDate(day: String, month: String): Boolean = day == "31" && (month == "4" || month == "6" || month == "9" || month == "11" || month == "04" || month == "06" || month == "09")
private fun isFebruaryMonth(month: String): Boolean = month == "2" || month == "02"
private fun isLeapYear(year: String): Boolean = year.toInt() % 4 == 0
private fun leapYearWith29Date(day: String): Boolean = !(day == "30" || day == "31")
private fun notLeapYearFebruary(day: String): Boolean = !(day == "29" || day == "30" || day == "31")
Validated with unit test case.
@Test
fun `it should validate date`() {
Assert.assertTrue(subject.validateDate("12/01/2012"))
Assert.assertTrue(subject.validateDate("01/12/2012"))
Assert.assertFalse(subject.validateDate("13/12/2012"))
Assert.assertFalse(subject.validateDate("13/01/2012"))
Assert.assertFalse(subject.validateDate("12/32/2012"))
Assert.assertFalse(subject.validateDate("14/01/2012"))
Assert.assertFalse(subject.validateDate("15/43/2012"))
Assert.assertTrue(subject.validateDate("02/28/2012"))
Assert.assertTrue(subject.validateDate("02/29/2012"))
Assert.assertFalse(subject.validateDate("02/29/2013"))
Assert.assertFalse(subject.validateDate("02/29/2015"))
Assert.assertTrue(subject.validateDate("02/29/2016"))
Assert.assertFalse(subject.validateDate("02/30/2012"))
Assert.assertTrue(subject.validateDate("02/29/2004"))
Assert.assertFalse(subject.validateDate("02/31/2004"))
Assert.assertFalse(subject.validateDate("14/30/2012"))
Assert.assertFalse(subject.validateDate("01/32/2012"))
Assert.assertFalse(subject.validateDate("13/03/2012"))
Assert.assertTrue(subject.validateDate("10/12/2000"))
}