diff --git a/uhabits-core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt b/uhabits-core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt index 22c2da753..8a528d08b 100644 --- a/uhabits-core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt +++ b/uhabits-core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt @@ -82,7 +82,10 @@ data class LocalDate(val daysSince2000: Int) { private fun updateYearMonthDayCache() { var currYear = 2000 var currDay = 0 - + if (daysSince2000 < 0) { + currYear -= 400 + currDay -= 146097 + } while (true) { val currYearLength = if (isLeapYear(currYear)) 366 else 365 if (daysSince2000 < currDay + currYearLength) { @@ -93,10 +96,8 @@ data class LocalDate(val daysSince2000: Int) { currDay += currYearLength } } - var currMonth = 1 val monthOffset = if (isLeapYear(currYear)) leapOffset else nonLeapOffset - while (true) { if (daysSince2000 < currDay + monthOffset[currMonth]) { monthCache = currMonth @@ -105,7 +106,6 @@ data class LocalDate(val daysSince2000: Int) { currMonth++ } } - currDay += monthOffset[currMonth - 1] dayCache = daysSince2000 - currDay + 1 } diff --git a/uhabits-core/src/jvmTest/java/org/isoron/platform/gui/DatesTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/platform/gui/DatesTest.kt new file mode 100644 index 000000000..47329ebc2 --- /dev/null +++ b/uhabits-core/src/jvmTest/java/org/isoron/platform/gui/DatesTest.kt @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2016-2021 Álinson Santos Xavier + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Loop Habit Tracker is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +package org.isoron.platform.gui + +import org.isoron.platform.time.LocalDate +import org.junit.Assert.assertEquals +import org.junit.Test + +class DatesTest { + @Test + fun testDatesBefore2000() { + val date = LocalDate(-1) + assertEquals(date.day, 31) + assertEquals(date.month, 12) + assertEquals(date.year, 1999) + } +}