diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.kt index debc7e26e..02908013d 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.kt @@ -30,13 +30,13 @@ import junit.framework.TestCase import org.hamcrest.CoreMatchers.hasItems import org.hamcrest.MatcherAssert.assertThat import org.isoron.platform.time.LocalDate +import org.isoron.platform.time.LocalDate.Companion.setStartDayOffset import org.isoron.uhabits.core.models.HabitList import org.isoron.uhabits.core.models.ModelFactory import org.isoron.uhabits.core.models.Timestamp import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.core.tasks.TaskRunner import org.isoron.uhabits.core.utils.DateUtils.Companion.getToday -import org.isoron.uhabits.core.utils.DateUtils.Companion.setStartDayOffset import org.isoron.uhabits.inject.ActivityContextModule import org.isoron.uhabits.inject.AppContextModule import org.isoron.uhabits.inject.HabitsModule diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.kt b/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.kt index 4f00f4d1f..ba4a6533c 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.kt @@ -21,10 +21,10 @@ package org.isoron.uhabits import android.app.Application import android.content.Context +import org.isoron.platform.time.LocalDate.Companion.setStartDayOffset import org.isoron.uhabits.core.database.UnsupportedDatabaseVersionException import org.isoron.uhabits.core.reminders.ReminderScheduler import org.isoron.uhabits.core.ui.NotificationTray -import org.isoron.uhabits.core.utils.DateUtils.Companion.setStartDayOffset import org.isoron.uhabits.inject.AppContextModule import org.isoron.uhabits.inject.DaggerHabitsApplicationComponent import org.isoron.uhabits.inject.HabitsApplicationComponent diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.kt b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.kt index 951b46ae8..b22454c02 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.kt @@ -23,10 +23,10 @@ import android.content.ContentUris import android.content.Context import android.content.Intent import android.util.Log +import org.isoron.platform.time.LocalDate.Companion.getStartOfTodayWithOffset import org.isoron.uhabits.HabitsApplication import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.Timestamp -import org.isoron.uhabits.core.utils.DateUtils.Companion.getStartOfTodayWithOffset /** * The Android BroadcastReceiver for Loop Habit Tracker. 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 c5f80bd92..327509fac 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 @@ -219,6 +219,18 @@ data class LocalDate(val daysSince2000: Int) { } fun getStartOfTodayWithOffset(): Long = getStartOfDayWithOffset(getLocalTime()) + + fun applyTimezone(localTimestamp: Long): Long { + val tz = getTimeZone() + val offset = tz.offsetAt( + Instant.fromEpochMilliseconds(localTimestamp) + ).totalSeconds * 1000 + val difference = localTimestamp - offset + val offsetDifference = tz.offsetAt( + Instant.fromEpochMilliseconds(difference) + ).totalSeconds * 1000 + return localTimestamp - offsetDifference + } } } diff --git a/uhabits-core/src/commonTest/kotlin/org/isoron/platform/core/BaseUnitTest.kt b/uhabits-core/src/commonTest/kotlin/org/isoron/platform/core/BaseUnitTest.kt new file mode 100644 index 000000000..aeeecd828 --- /dev/null +++ b/uhabits-core/src/commonTest/kotlin/org/isoron/platform/core/BaseUnitTest.kt @@ -0,0 +1,26 @@ +package org.isoron.platform.core + +import org.isoron.platform.time.LocalDate +import kotlin.test.AfterTest +import kotlin.test.BeforeTest + +open class BaseUnitTest { + @BeforeTest + @Throws(Exception::class) + open fun setUp() { + LocalDate.fixedLocalTime = FIXED_LOCAL_TIME + LocalDate.setStartDayOffset(0, 0) + } + + @AfterTest + @Throws(Exception::class) + open fun tearDown() { + LocalDate.fixedLocalTime = null + LocalDate.setStartDayOffset(0, 0) + } + + companion object { + // 8:00am, January 25th, 2015 (UTC) + const val FIXED_LOCAL_TIME = 1422172800000L + } +} diff --git a/uhabits-core/src/commonTest/kotlin/org/isoron/platform/time/DatesTest.kt b/uhabits-core/src/commonTest/kotlin/org/isoron/platform/time/DatesTest.kt index b8c73a05a..c0d849cf0 100644 --- a/uhabits-core/src/commonTest/kotlin/org/isoron/platform/time/DatesTest.kt +++ b/uhabits-core/src/commonTest/kotlin/org/isoron/platform/time/DatesTest.kt @@ -20,8 +20,11 @@ package org.isoron.platform.time import kotlinx.datetime.LocalDateTime +import kotlinx.datetime.Month import kotlinx.datetime.TimeZone import kotlinx.datetime.toInstant +import org.isoron.platform.core.BaseUnitTest +import org.isoron.platform.time.LocalDate.Companion.applyTimezone import org.isoron.platform.time.LocalDate.Companion.getStartOfDay import org.isoron.platform.time.LocalDate.Companion.getStartOfDayWithOffset import org.isoron.platform.time.LocalDate.Companion.getStartOfToday @@ -31,7 +34,7 @@ import kotlin.test.Test import kotlin.test.assertContentEquals import kotlin.test.assertEquals -class DatesTest { +class DatesTest : BaseUnitTest() { @Test fun testDatesBefore2000() { val date = LocalDate(-1) @@ -44,7 +47,7 @@ class DatesTest { fun testGetLocalTime() { LocalDate.fixedLocalTime = null LocalDate.fixedTimeZone = TimeZone.of("Australia/Sydney") - val utcTestTimeInMillis = unixTime(2015, 1, 11) + val utcTestTimeInMillis = unixTime(2015, Month.JANUARY, 11) val localTimeInMillis = LocalDate.getLocalTime(utcTestTimeInMillis) val expectedUnixTimeOffsetForSydney = 11 * 60 * 60 * 1000 val expectedUnixTimeForSydney = utcTestTimeInMillis + expectedUnixTimeOffsetForSydney @@ -59,16 +62,16 @@ class DatesTest { @Test fun testGetStartOfDay() { - val expectedStartOfDayUtc = unixTime(2017, 1, 1) - val laterInTheDayUtc = unixTime(2017, 1, 1, 20, 0) + val expectedStartOfDayUtc = unixTime(2017, Month.JANUARY, 1) + val laterInTheDayUtc = unixTime(2017, Month.JANUARY, 1, 20, 0) val startOfDay = getStartOfDay(laterInTheDayUtc) assertEquals(expectedStartOfDayUtc, startOfDay) } @Test fun testGetStartOfToday() { - val expectedStartOfDayUtc = unixTime(2017, 1, 1) - val laterInTheDayUtc = unixTime(2017, 1, 1, 20, 0) + val expectedStartOfDayUtc = unixTime(2017, Month.JANUARY, 1) + val laterInTheDayUtc = unixTime(2017, Month.JANUARY, 1, 20, 0) LocalDate.fixedLocalTime = laterInTheDayUtc val startOfToday = getStartOfToday() assertEquals(expectedStartOfDayUtc, startOfToday) @@ -77,7 +80,7 @@ class DatesTest { @Test @Throws(Exception::class) fun testGetStartOfDayWithOffset() { - val timestamp = unixTime(2020, 9, 3) + val timestamp = unixTime(2020, Month.SEPTEMBER, 3) assertEquals( timestamp, getStartOfDayWithOffset(timestamp + LocalDate.HOUR_LENGTH), @@ -94,8 +97,8 @@ class DatesTest { val hourOffset = 3 LocalDate.setStartDayOffset(hourOffset, 0) LocalDate.fixedTimeZone = kotlinx.datetime.TimeZone.UTC - val startOfYesterday = unixTime(2017, 1, 1, 0, 0) - val priorToOffset = unixTime(2017, 1, 2, hourOffset - 1, 0) + val startOfYesterday = unixTime(2017, Month.JANUARY, 1, 0, 0) + val priorToOffset = unixTime(2017, Month.JANUARY, 2, hourOffset - 1, 0) LocalDate.fixedLocalTime = priorToOffset val startOfTodayWithOffset = getStartOfTodayWithOffset() assertEquals(startOfYesterday, startOfTodayWithOffset) @@ -106,20 +109,159 @@ class DatesTest { val hourOffset = 3 LocalDate.setStartDayOffset(hourOffset, 0) LocalDate.fixedTimeZone = kotlinx.datetime.TimeZone.UTC - val startOfToday = unixTime(2017, 1, 1, 0, 0) - val afterOffset = unixTime(2017, 1, 1, hourOffset + 1, 0) + val startOfToday = unixTime(2017, Month.JANUARY, 1, 0, 0) + val afterOffset = unixTime(2017, Month.JANUARY, 1, hourOffset + 1, 0) LocalDate.fixedLocalTime = afterOffset val startOfTodayWithOffset = getStartOfTodayWithOffset() assertEquals(startOfToday, startOfTodayWithOffset) } - private fun unixTime(year: Int, month: Int, day: Int): Long { + @Test + fun test_applyTimezone() { + LocalDate.fixedTimeZone = TimeZone.of("Australia/Sydney") + assertEquals( + applyTimezone(unixTime(2017, Month.JULY, 30, 18, 0)), + unixTime(2017, Month.JULY, 30, 8, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.SEPTEMBER, 30, 0, 0)), + unixTime(2017, Month.SEPTEMBER, 29, 14, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.SEPTEMBER, 30, 10, 0)), + unixTime(2017, Month.SEPTEMBER, 30, 0, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.SEPTEMBER, 30, 11, 0)), + unixTime(2017, Month.SEPTEMBER, 30, 1, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.SEPTEMBER, 30, 12, 0)), + unixTime(2017, Month.SEPTEMBER, 30, 2, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.SEPTEMBER, 30, 13, 0)), + unixTime(2017, Month.SEPTEMBER, 30, 3, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.SEPTEMBER, 30, 22, 0)), + unixTime(2017, Month.SEPTEMBER, 30, 12, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.SEPTEMBER, 30, 23, 0)), + unixTime(2017, Month.SEPTEMBER, 30, 13, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.OCTOBER, 1, 0, 0)), + unixTime(2017, Month.SEPTEMBER, 30, 14, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.OCTOBER, 1, 1, 0)), + unixTime(2017, Month.SEPTEMBER, 30, 15, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.OCTOBER, 1, 1, 59)), + unixTime(2017, Month.SEPTEMBER, 30, 15, 59) + ) + // DST begins + assertEquals( + applyTimezone(unixTime(2017, Month.OCTOBER, 1, 3, 0)), + unixTime(2017, Month.SEPTEMBER, 30, 16, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.OCTOBER, 1, 4, 0)), + unixTime(2017, Month.SEPTEMBER, 30, 17, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.OCTOBER, 1, 5, 0)), + unixTime(2017, Month.SEPTEMBER, 30, 18, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.OCTOBER, 1, 11, 0)), + unixTime(2017, Month.OCTOBER, 1, 0, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.OCTOBER, 1, 12, 0)), + unixTime(2017, Month.OCTOBER, 1, 1, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.OCTOBER, 1, 13, 0)), + unixTime(2017, Month.OCTOBER, 1, 2, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.OCTOBER, 1, 14, 0)), + unixTime(2017, Month.OCTOBER, 1, 3, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.OCTOBER, 1, 15, 0)), + unixTime(2017, Month.OCTOBER, 1, 4, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.OCTOBER, 1, 19, 0)), + unixTime(2017, Month.OCTOBER, 1, 8, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.OCTOBER, 2, 19, 0)), + unixTime(2017, Month.OCTOBER, 2, 8, 0) + ) + assertEquals( + applyTimezone(unixTime(2017, Month.NOVEMBER, 30, 19, 0)), + unixTime(2017, Month.NOVEMBER, 30, 8, 0) + ) + assertEquals( + applyTimezone(unixTime(2018, Month.MARCH, 31, 0, 0)), + unixTime(2018, Month.MARCH, 30, 13, 0) + ) + assertEquals( + applyTimezone(unixTime(2018, Month.MARCH, 31, 12, 0)), + unixTime(2018, Month.MARCH, 31, 1, 0) + ) + assertEquals( + applyTimezone(unixTime(2018, Month.MARCH, 31, 18, 0)), + unixTime(2018, Month.MARCH, 31, 7, 0) + ) + assertEquals( + applyTimezone(unixTime(2018, Month.APRIL, 1, 0, 0)), + unixTime(2018, Month.MARCH, 31, 13, 0) + ) + assertEquals( + applyTimezone(unixTime(2018, Month.APRIL, 1, 1, 0)), + unixTime(2018, Month.MARCH, 31, 14, 0) + ) + assertEquals( + applyTimezone(unixTime(2018, Month.APRIL, 1, 1, 59)), + unixTime(2018, Month.MARCH, 31, 14, 59) + ) + // DST ends + assertEquals( + applyTimezone(unixTime(2018, Month.APRIL, 1, 2, 0)), + unixTime(2018, Month.MARCH, 31, 16, 0) + ) + assertEquals( + applyTimezone(unixTime(2018, Month.APRIL, 1, 3, 0)), + unixTime(2018, Month.MARCH, 31, 17, 0) + ) + assertEquals( + applyTimezone(unixTime(2018, Month.APRIL, 1, 4, 0)), + unixTime(2018, Month.MARCH, 31, 18, 0) + ) + assertEquals( + applyTimezone(unixTime(2018, Month.APRIL, 1, 10, 0)), + unixTime(2018, Month.APRIL, 1, 0, 0) + ) + assertEquals( + applyTimezone(unixTime(2018, Month.APRIL, 1, 18, 0)), + unixTime(2018, Month.APRIL, 1, 8, 0) + ) + } + + private fun unixTime(year: Int, month: Month, day: Int): Long { return unixTime(year, month, day, 0, 0) } private fun unixTime( year: Int, - month: Int, + month: Month, day: Int, hour: Int, minute: Int, diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/reminders/ReminderScheduler.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/reminders/ReminderScheduler.kt index 68c19ce1c..2e20f5033 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/reminders/ReminderScheduler.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/reminders/ReminderScheduler.kt @@ -18,6 +18,7 @@ */ package org.isoron.uhabits.core.reminders +import org.isoron.platform.time.LocalDate.Companion.applyTimezone import org.isoron.platform.time.LocalDate.Companion.getLocalTime import org.isoron.platform.time.LocalDate.Companion.getStartOfDayWithOffset import org.isoron.uhabits.core.AppScope @@ -29,7 +30,6 @@ import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.HabitList import org.isoron.uhabits.core.models.HabitMatcher import org.isoron.uhabits.core.preferences.WidgetPreferences -import org.isoron.uhabits.core.utils.DateUtils.Companion.applyTimezone import org.isoron.uhabits.core.utils.DateUtils.Companion.removeTimezone import java.util.Locale import java.util.Objects diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt index 653e0f196..45af855c3 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt @@ -22,6 +22,7 @@ import kotlinx.datetime.Instant import kotlinx.datetime.offsetAt import org.isoron.platform.time.LocalDate import org.isoron.platform.time.LocalDate.Companion.DAY_LENGTH +import org.isoron.platform.time.LocalDate.Companion.applyTimezone import org.isoron.platform.time.LocalDate.Companion.getLocalTime import org.isoron.platform.time.LocalDate.Companion.getStartOfToday import org.isoron.platform.time.LocalDate.Companion.getStartOfTodayWithOffset @@ -39,20 +40,6 @@ import java.util.TimeZone abstract class DateUtils { companion object { - - @JvmStatic - fun applyTimezone(localTimestamp: Long): Long { - val tz = getTimeZone() - val offset = tz.offsetAt( - Instant.fromEpochMilliseconds(localTimestamp) - ).totalSeconds * 1000 - val difference = localTimestamp - offset - val offsetDifference = tz.offsetAt( - Instant.fromEpochMilliseconds(difference) - ).totalSeconds * 1000 - return localTimestamp - offsetDifference - } - @JvmStatic fun formatHeaderDate(day: GregorianCalendar): String { val locale = getLocale() diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/BaseUnitTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/BaseUnitTest.kt index e102ab7fc..acbe88078 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/BaseUnitTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/BaseUnitTest.kt @@ -21,6 +21,7 @@ package org.isoron.uhabits.core import com.nhaarman.mockitokotlin2.spy import com.nhaarman.mockitokotlin2.validateMockitoUsage import org.apache.commons.io.IOUtils +import org.isoron.platform.core.BaseUnitTest.Companion.FIXED_LOCAL_TIME import org.isoron.platform.time.LocalDate import org.isoron.platform.time.LocalDate.Companion.setStartDayOffset import org.isoron.uhabits.core.commands.CommandRunner @@ -139,8 +140,6 @@ open class BaseUnitTest { } companion object { - // 8:00am, January 25th, 2015 (UTC) - const val FIXED_LOCAL_TIME = 1422172800000L fun buildMemoryDatabase(): Database { return try { val db: Database = JdbcDatabase( diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/reminders/ReminderSchedulerTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/reminders/ReminderSchedulerTest.kt index c0c83682c..1fefe5ef2 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/reminders/ReminderSchedulerTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/reminders/ReminderSchedulerTest.kt @@ -23,12 +23,12 @@ import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.verify import com.nhaarman.mockitokotlin2.whenever import org.isoron.platform.time.LocalDate +import org.isoron.platform.time.LocalDate.Companion.applyTimezone import org.isoron.uhabits.core.BaseUnitTest import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.Reminder import org.isoron.uhabits.core.models.WeekdayList import org.isoron.uhabits.core.preferences.WidgetPreferences -import org.isoron.uhabits.core.utils.DateUtils.Companion.applyTimezone import org.isoron.uhabits.core.utils.DateUtils.Companion.getStartOfTodayCalendar import org.isoron.uhabits.core.utils.DateUtils.Companion.removeTimezone import org.junit.Before diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt index 557053d92..88066ce51 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt @@ -22,6 +22,7 @@ import io.fluidsonic.locale.Locale import junit.framework.Assert.assertEquals import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.core.IsEqual.equalTo +import org.isoron.platform.core.BaseUnitTest.Companion.FIXED_LOCAL_TIME import org.isoron.platform.time.LocalDate import org.isoron.platform.time.LocalDate.Companion.DAY_LENGTH import org.isoron.platform.time.LocalDate.Companion.HOUR_LENGTH @@ -29,7 +30,6 @@ import org.isoron.platform.time.LocalDate.Companion.MINUTE_LENGTH import org.isoron.platform.time.LocalDate.Companion.setStartDayOffset import org.isoron.uhabits.core.BaseUnitTest import org.isoron.uhabits.core.models.Timestamp -import org.isoron.uhabits.core.utils.DateUtils.Companion.applyTimezone import org.isoron.uhabits.core.utils.DateUtils.Companion.formatHeaderDate import org.isoron.uhabits.core.utils.DateUtils.Companion.getTodayWithOffset import org.isoron.uhabits.core.utils.DateUtils.Companion.millisecondsUntilTomorrowWithOffset @@ -318,145 +318,6 @@ class DateUtilsTest : BaseUnitTest() { ) } - @Test - fun test_applyTimezone() { - LocalDate.fixedTimeZone = kotlinx.datetime.TimeZone.of("Australia/Sydney") - assertEquals( - applyTimezone(unixTime(2017, Calendar.JULY, 30, 18, 0)), - unixTime(2017, Calendar.JULY, 30, 8, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.SEPTEMBER, 30, 0, 0)), - unixTime(2017, Calendar.SEPTEMBER, 29, 14, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.SEPTEMBER, 30, 10, 0)), - unixTime(2017, Calendar.SEPTEMBER, 30, 0, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.SEPTEMBER, 30, 11, 0)), - unixTime(2017, Calendar.SEPTEMBER, 30, 1, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.SEPTEMBER, 30, 12, 0)), - unixTime(2017, Calendar.SEPTEMBER, 30, 2, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.SEPTEMBER, 30, 13, 0)), - unixTime(2017, Calendar.SEPTEMBER, 30, 3, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.SEPTEMBER, 30, 22, 0)), - unixTime(2017, Calendar.SEPTEMBER, 30, 12, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.SEPTEMBER, 30, 23, 0)), - unixTime(2017, Calendar.SEPTEMBER, 30, 13, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.OCTOBER, 1, 0, 0)), - unixTime(2017, Calendar.SEPTEMBER, 30, 14, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.OCTOBER, 1, 1, 0)), - unixTime(2017, Calendar.SEPTEMBER, 30, 15, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.OCTOBER, 1, 1, 59)), - unixTime(2017, Calendar.SEPTEMBER, 30, 15, 59) - ) - // DST begins - assertEquals( - applyTimezone(unixTime(2017, Calendar.OCTOBER, 1, 3, 0)), - unixTime(2017, Calendar.SEPTEMBER, 30, 16, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.OCTOBER, 1, 4, 0)), - unixTime(2017, Calendar.SEPTEMBER, 30, 17, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.OCTOBER, 1, 5, 0)), - unixTime(2017, Calendar.SEPTEMBER, 30, 18, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.OCTOBER, 1, 11, 0)), - unixTime(2017, Calendar.OCTOBER, 1, 0, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.OCTOBER, 1, 12, 0)), - unixTime(2017, Calendar.OCTOBER, 1, 1, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.OCTOBER, 1, 13, 0)), - unixTime(2017, Calendar.OCTOBER, 1, 2, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.OCTOBER, 1, 14, 0)), - unixTime(2017, Calendar.OCTOBER, 1, 3, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.OCTOBER, 1, 15, 0)), - unixTime(2017, Calendar.OCTOBER, 1, 4, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.OCTOBER, 1, 19, 0)), - unixTime(2017, Calendar.OCTOBER, 1, 8, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.OCTOBER, 2, 19, 0)), - unixTime(2017, Calendar.OCTOBER, 2, 8, 0) - ) - assertEquals( - applyTimezone(unixTime(2017, Calendar.NOVEMBER, 30, 19, 0)), - unixTime(2017, Calendar.NOVEMBER, 30, 8, 0) - ) - assertEquals( - applyTimezone(unixTime(2018, Calendar.MARCH, 31, 0, 0)), - unixTime(2018, Calendar.MARCH, 30, 13, 0) - ) - assertEquals( - applyTimezone(unixTime(2018, Calendar.MARCH, 31, 12, 0)), - unixTime(2018, Calendar.MARCH, 31, 1, 0) - ) - assertEquals( - applyTimezone(unixTime(2018, Calendar.MARCH, 31, 18, 0)), - unixTime(2018, Calendar.MARCH, 31, 7, 0) - ) - assertEquals( - applyTimezone(unixTime(2018, Calendar.APRIL, 1, 0, 0)), - unixTime(2018, Calendar.MARCH, 31, 13, 0) - ) - assertEquals( - applyTimezone(unixTime(2018, Calendar.APRIL, 1, 1, 0)), - unixTime(2018, Calendar.MARCH, 31, 14, 0) - ) - assertEquals( - applyTimezone(unixTime(2018, Calendar.APRIL, 1, 1, 59)), - unixTime(2018, Calendar.MARCH, 31, 14, 59) - ) - // DST ends - assertEquals( - applyTimezone(unixTime(2018, Calendar.APRIL, 1, 2, 0)), - unixTime(2018, Calendar.MARCH, 31, 16, 0) - ) - assertEquals( - applyTimezone(unixTime(2018, Calendar.APRIL, 1, 3, 0)), - unixTime(2018, Calendar.MARCH, 31, 17, 0) - ) - assertEquals( - applyTimezone(unixTime(2018, Calendar.APRIL, 1, 4, 0)), - unixTime(2018, Calendar.MARCH, 31, 18, 0) - ) - assertEquals( - applyTimezone(unixTime(2018, Calendar.APRIL, 1, 10, 0)), - unixTime(2018, Calendar.APRIL, 1, 0, 0) - ) - assertEquals( - applyTimezone(unixTime(2018, Calendar.APRIL, 1, 18, 0)), - unixTime(2018, Calendar.APRIL, 1, 8, 0) - ) - } - @Test fun test_removeTimezone() { LocalDate.fixedTimeZone = kotlinx.datetime.TimeZone.of("Australia/Sydney")