diff --git a/androidApp/src/test/kotlin/DatesTest.kt b/androidApp/src/test/kotlin/DatesTest.kt index 3f373d4..b751969 100644 --- a/androidApp/src/test/kotlin/DatesTest.kt +++ b/androidApp/src/test/kotlin/DatesTest.kt @@ -9,38 +9,49 @@ import org.junit.Test class DatesTest { - private val v3Date = "2013-04-07T13:43:00+01:00" - private val v4Date = "2013-04-07 13:43:00" - private val bug1Date = "2022-12-24T17:00:08+00" + private val newVersionDateVariant = "2022-12-24T17:00:08+00" + private val newVersionDate = "2013-04-07T13:43:00+01:00" + private val oldVersionDate = "2013-05-07 13:46:00" + private val oldVersionDateVariant = "2021-03-21 10:32:00.000000" @Test - fun v3_date_should_be_parsed() { - val date = DateUtils.parseDate(v3Date) - val expected = - LocalDateTime(2013, 4, 7, 14, 43, 0, 0).toInstant(TimeZone.currentSystemDefault()) - .toEpochMilliseconds() - - assertEquals(date, expected) - } - - @Test - fun v4_date_should_be_parsed() { - val date = DateUtils.parseDate(v4Date) + fun new_version_date_should_be_parsed() { + val date = DateUtils.parseDate(newVersionDate) val expected = LocalDateTime(2013, 4, 7, 13, 43, 0, 0).toInstant(TimeZone.currentSystemDefault()) .toEpochMilliseconds() - assertEquals(date, expected) + assertEquals(expected, date) } @Test - fun bug1_date_should_be_parsed() { - val date = DateUtils.parseDate(bug1Date) + fun old_version_date_should_be_parsed() { + val date = DateUtils.parseDate(oldVersionDate) val expected = - LocalDateTime(2022, 12, 24, 18, 0, 8, 0).toInstant(TimeZone.currentSystemDefault()) + LocalDateTime(2013, 5, 7, 13, 46, 0, 0).toInstant(TimeZone.currentSystemDefault()) .toEpochMilliseconds() - assertEquals(date, expected) + assertEquals(expected, date) + } + + @Test + fun old_version_variant_date_should_be_parsed() { + val date = DateUtils.parseDate(oldVersionDateVariant) + val expected = + LocalDateTime(2021, 3, 21, 10, 32, 0, 0).toInstant(TimeZone.currentSystemDefault()) + .toEpochMilliseconds() + + assertEquals(expected, date) + } + + @Test + fun new_version_variant_date_should_be_parsed() { + val date = DateUtils.parseDate(newVersionDateVariant) + val expected = + LocalDateTime(2022, 12, 24, 17, 0, 8, 0).toInstant(TimeZone.currentSystemDefault()) + .toEpochMilliseconds() + + assertEquals(expected, date) } } diff --git a/shared/src/androidMain/kotlin/bou/amine/apps/readerforselfossv2/utils/DateUtils.kt b/shared/src/androidMain/kotlin/bou/amine/apps/readerforselfossv2/utils/DateUtils.kt index 2349d3b..5f8ea41 100644 --- a/shared/src/androidMain/kotlin/bou/amine/apps/readerforselfossv2/utils/DateUtils.kt +++ b/shared/src/androidMain/kotlin/bou/amine/apps/readerforselfossv2/utils/DateUtils.kt @@ -6,16 +6,25 @@ import kotlinx.datetime.* actual class DateUtils { actual companion object { + + // Possible formats are + // yyyy-mm-dd hh:mm:ss format + private val oldVersionFormat = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}(.()\\d*)?".toRegex() + // yyyy-MM-dd'T'HH:mm:ss[.SSS]XXX (RFC3339) + private val newVersionFormat = "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}(:\\d{2})?".toRegex() + + // We may need to consider moving the formatting to platform specific code, even if the tests are doubled + // For now, we handle this in a hacky way, because kotlin only accepts iso formats actual fun parseDate(dateString: String): Long { - return try { - Instant.parse(dateString).toEpochMilliseconds() - } catch (e: Exception) { - var str = dateString.replace(" ", "T") - if (str.matches("\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}".toRegex())) { - str = str.split("+")[0] - } - LocalDateTime.parse(str).toInstant(TimeZone.currentSystemDefault()).toEpochMilliseconds() + var isoDateString: String = if (dateString.matches(oldVersionFormat)) { + dateString.replace(" ", "T") + } else if (dateString.matches(newVersionFormat)) { + dateString.split("+")[0] + } else { + throw Exception("Unrecognized format for $dateString") } + + return LocalDateTime.parse(isoDateString).toInstant(TimeZone.currentSystemDefault()).toEpochMilliseconds() } actual fun parseRelativeDate(dateString: String): String {