Date Validation in Android

后端 未结 6 1692
日久生厌
日久生厌 2020-12-03 09:05

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?<

6条回答
  •  無奈伤痛
    2020-12-03 10:00

    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"))
        }
    

提交回复
热议问题