Begin Timestamp conversion

pull/1120/head
sgallese 4 years ago
parent 4b92735a8b
commit bead6d7dab

@ -23,6 +23,7 @@ import io.fluidsonic.locale.Locale
import kotlinx.datetime.Clock import kotlinx.datetime.Clock
import kotlinx.datetime.Instant import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDateTime import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.Month
import kotlinx.datetime.TimeZone import kotlinx.datetime.TimeZone
import kotlinx.datetime.offsetAt import kotlinx.datetime.offsetAt
import kotlinx.datetime.toInstant import kotlinx.datetime.toInstant
@ -47,7 +48,7 @@ data class LocalDate(val daysSince2000: Int) {
var monthCache = -1 var monthCache = -1
var dayCache = -1 var dayCache = -1
constructor(year: Int, month: Int, day: Int) : constructor(year: Int, month: Month, day: Int) :
this(daysSince2000(year, month, day)) this(daysSince2000(year, month, day))
val dayOfWeek: DayOfWeek val dayOfWeek: DayOfWeek
@ -295,16 +296,16 @@ val nonLeapOffset = arrayOf(
212, 243, 273, 304, 334, 365 212, 243, 273, 304, 334, 365
) )
private fun daysSince2000(year: Int, month: Int, day: Int): Int { internal fun daysSince2000(year: Int, month: Month, day: Int): Int {
var result = 365 * (year - 2000) var result = 365 * (year - 2000)
result += ceil((year - 2000) / 4.0).toInt() result += ceil((year - 2000) / 4.0).toInt()
result -= ceil((year - 2000) / 100.0).toInt() result -= ceil((year - 2000) / 100.0).toInt()
result += ceil((year - 2000) / 400.0).toInt() result += ceil((year - 2000) / 400.0).toInt()
result += if (isLeapYear(year)) { result += if (isLeapYear(year)) {
leapOffset[month - 1] leapOffset[month.ordinal]
} else { } else {
nonLeapOffset[month - 1] nonLeapOffset[month.ordinal]
} }
result += (day - 1) result += (day - 1)
return result return result

@ -418,6 +418,21 @@ class DatesTest : BaseUnitTest() {
assertEquals(expected, upcomingTimeMillis) assertEquals(expected, upcomingTimeMillis)
} }
@Test
fun testDaysSince2000() {
val zeroDays = daysSince2000(2000, Month.JANUARY, 1)
assertEquals(0, zeroDays)
val oneYearWithLeapYear = daysSince2000(2001, Month.JANUARY, 1)
assertEquals(366, oneYearWithLeapYear)
val fourYearsWithLeapYear = daysSince2000(2004, Month.JANUARY, 1)
assertEquals(1461, fourYearsWithLeapYear)
val oneYearPrior = daysSince2000(1999, Month.JANUARY, 1)
assertEquals(-365, oneYearPrior)
}
private fun unixTime(year: Int, month: Month, day: Int): Long { private fun unixTime(year: Int, month: Month, day: Int): Long {
return unixTime(year, month, day, 0, 0) return unixTime(year, month, day, 0, 0)
} }
@ -434,4 +449,8 @@ class DatesTest : BaseUnitTest() {
year, month, day, hour, minute, (milliseconds / 1000).toInt(), 0 year, month, day, hour, minute, (milliseconds / 1000).toInt(), 0
).toInstant(TimeZone.UTC).toEpochMilliseconds() ).toInstant(TimeZone.UTC).toEpochMilliseconds()
} }
companion object {
const val JAN_1_2000_IN_UNIX_TIME = 946684800000L
}
} }

@ -19,6 +19,7 @@
package org.isoron.platform.time package org.isoron.platform.time
import kotlinx.datetime.Month
import java.util.Calendar.DAY_OF_MONTH import java.util.Calendar.DAY_OF_MONTH
import java.util.Calendar.DAY_OF_WEEK import java.util.Calendar.DAY_OF_WEEK
import java.util.Calendar.HOUR_OF_DAY import java.util.Calendar.HOUR_OF_DAY
@ -59,7 +60,7 @@ class JavaLocalDateFormatter(private val locale: Locale) : LocalDateFormatter {
override fun shortWeekdayName(weekday: DayOfWeek): String { override fun shortWeekdayName(weekday: DayOfWeek): String {
val cal = GregorianCalendar() val cal = GregorianCalendar()
cal.set(DAY_OF_WEEK, weekday.daysSinceSunday - 1) cal.set(DAY_OF_WEEK, weekday.daysSinceSunday - 1)
return shortWeekdayName(LocalDate(cal.get(YEAR), cal.get(MONTH) + 1, cal.get(DAY_OF_MONTH))) return shortWeekdayName(LocalDate(cal.get(YEAR), Month(cal.get(MONTH) + 1), cal.get(DAY_OF_MONTH)))
} }
override fun shortWeekdayName(date: LocalDate): String { override fun shortWeekdayName(date: LocalDate): String {

@ -114,13 +114,6 @@ data class Timestamp(var unixTime: Long) : Comparable<Timestamp> {
cal[year, javaMonth, day, 0, 0] = 0 cal[year, javaMonth, day, 0, 0] = 0
return Timestamp(cal.timeInMillis) return Timestamp(cal.timeInMillis)
} }
/**
* Given two timestamps, returns whichever timestamp is the oldest one.
*/
fun oldest(first: Timestamp, second: Timestamp): Timestamp {
return if (first.unixTime < second.unixTime) first else second
}
} }
init { init {

@ -19,6 +19,7 @@
package org.isoron.uhabits.core.ui.views package org.isoron.uhabits.core.ui.views
import kotlinx.datetime.Month
import org.isoron.platform.gui.Canvas import org.isoron.platform.gui.Canvas
import org.isoron.platform.gui.Color import org.isoron.platform.gui.Color
import org.isoron.platform.gui.DataView import org.isoron.platform.gui.DataView
@ -63,7 +64,7 @@ class HistoryChart(
private var height = 0.0 private var height = 0.0
private var nColumns = 0 private var nColumns = 0
private var topLeftOffset = 0 private var topLeftOffset = 0
private var topLeftDate = LocalDate(2020, 1, 1) private var topLeftDate = LocalDate(2020, Month.JANUARY, 1)
private var lastPrintedMonth = "" private var lastPrintedMonth = ""
private var lastPrintedYear = "" private var lastPrintedYear = ""
private var headerOverflow = 0.0 private var headerOverflow = 0.0

@ -24,11 +24,22 @@ import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.equalTo import org.hamcrest.Matchers.equalTo
import org.hamcrest.Matchers.greaterThan import org.hamcrest.Matchers.greaterThan
import org.hamcrest.Matchers.lessThan import org.hamcrest.Matchers.lessThan
import org.isoron.platform.time.DatesTest.Companion.JAN_1_2000_IN_UNIX_TIME
import org.isoron.platform.time.LocalDate
import org.isoron.uhabits.core.BaseUnitTest import org.isoron.uhabits.core.BaseUnitTest
import org.isoron.uhabits.core.utils.DateUtils.Companion.getToday import org.isoron.uhabits.core.utils.DateUtils.Companion.getToday
import org.junit.Test import org.junit.Test
import java.time.Month
import kotlin.test.assertEquals
class TimestampTest : BaseUnitTest() { class TimestampTest : BaseUnitTest() {
@Test
fun testToLocalDate() {
val timestamp = Timestamp(JAN_1_2000_IN_UNIX_TIME)
val expectedLocalDate = LocalDate(2000, Month.JANUARY ,1)
assertEquals(expectedLocalDate, timestamp.toLocalDate())
}
@Test @Test
@Throws(Exception::class) @Throws(Exception::class)
fun testCompare() { fun testCompare() {

@ -20,6 +20,7 @@
package org.isoron.uhabits.core.ui.views package org.isoron.uhabits.core.ui.views
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlinx.datetime.Month
import org.isoron.platform.gui.assertRenders import org.isoron.platform.gui.assertRenders
import org.isoron.platform.time.JavaLocalDateFormatter import org.isoron.platform.time.JavaLocalDateFormatter
import org.isoron.platform.time.LocalDate import org.isoron.platform.time.LocalDate
@ -28,7 +29,7 @@ import java.util.Locale
class BarChartTest { class BarChartTest {
val base = "views/BarChart" val base = "views/BarChart"
val today = LocalDate(2015, 1, 25) val today = LocalDate(2015, Month.JANUARY, 25)
private val fmt = JavaLocalDateFormatter(Locale.US) private val fmt = JavaLocalDateFormatter(Locale.US)
val theme = LightTheme() val theme = LightTheme()
val component = BarChart(theme, fmt) val component = BarChart(theme, fmt)

@ -24,6 +24,7 @@ import com.nhaarman.mockitokotlin2.reset
import com.nhaarman.mockitokotlin2.verify import com.nhaarman.mockitokotlin2.verify
import com.nhaarman.mockitokotlin2.verifyNoMoreInteractions import com.nhaarman.mockitokotlin2.verifyNoMoreInteractions
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlinx.datetime.Month
import org.isoron.platform.gui.assertRenders import org.isoron.platform.gui.assertRenders
import org.isoron.platform.time.DayOfWeek import org.isoron.platform.time.DayOfWeek
import org.isoron.platform.time.DayOfWeek.SUNDAY import org.isoron.platform.time.DayOfWeek.SUNDAY
@ -43,7 +44,7 @@ class HistoryChartTest {
private val dateClickedListener: OnDateClickedListener = mock() private val dateClickedListener: OnDateClickedListener = mock()
val view = HistoryChart( val view = HistoryChart(
today = LocalDate(2015, 1, 25), today = LocalDate(2015, Month.JANUARY, 25),
paletteColor = PaletteColor(7), paletteColor = PaletteColor(7),
theme = LightTheme(), theme = LightTheme(),
dateFormatter = JavaLocalDateFormatter(Locale.US), dateFormatter = JavaLocalDateFormatter(Locale.US),
@ -86,20 +87,20 @@ class HistoryChartTest {
// Click top left date // Click top left date
view.onClick(20.0, 46.0) view.onClick(20.0, 46.0)
verify(dateClickedListener).onDateClicked(LocalDate(2014, 10, 26)) verify(dateClickedListener).onDateClicked(LocalDate(2014, Month.OCTOBER, 26))
reset(dateClickedListener) reset(dateClickedListener)
view.onClick(2.0, 28.0) view.onClick(2.0, 28.0)
verify(dateClickedListener).onDateClicked(LocalDate(2014, 10, 26)) verify(dateClickedListener).onDateClicked(LocalDate(2014, Month.OCTOBER, 26))
reset(dateClickedListener) reset(dateClickedListener)
// Click date in the middle // Click date in the middle
view.onClick(163.0, 113.0) view.onClick(163.0, 113.0)
verify(dateClickedListener).onDateClicked(LocalDate(2014, 12, 10)) verify(dateClickedListener).onDateClicked(LocalDate(2014, Month.DECEMBER, 10))
reset(dateClickedListener) reset(dateClickedListener)
// Click today // Click today
view.onClick(336.0, 37.0) view.onClick(336.0, 37.0)
verify(dateClickedListener).onDateClicked(LocalDate(2015, 1, 25)) verify(dateClickedListener).onDateClicked(LocalDate(2015, Month.JANUARY, 25))
reset(dateClickedListener) reset(dateClickedListener)
// Click header // Click header

Loading…
Cancel
Save