From 766b57d52d583f46f8f2f36b0af68f1c5b171505 Mon Sep 17 00:00:00 2001 From: Kyle Corry Date: Sat, 12 Sep 2020 15:27:22 -0400 Subject: [PATCH] Get more accurate sunrise/set times --- .../trailsensecore/domain/astronomy/Astro.kt | 25 ++++++++++++++++--- .../domain/time/TimeExtensions.kt | 6 ++--- .../domain/astronomy/AstroTest.kt | 1 + 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/kylecorry/trailsensecore/domain/astronomy/Astro.kt b/app/src/main/java/com/kylecorry/trailsensecore/domain/astronomy/Astro.kt index 8281266f..96c4650d 100644 --- a/app/src/main/java/com/kylecorry/trailsensecore/domain/astronomy/Astro.kt +++ b/app/src/main/java/com/kylecorry/trailsensecore/domain/astronomy/Astro.kt @@ -356,9 +356,12 @@ internal object Astro { coordinate: Coordinate, standardAltitude: Double = -0.8333 ): RiseSetTransitTimes { - val ut = ut(date).toLocalDate().atStartOfDay() - val sr = meanSiderealTime(julianDay(ut)) - val sun = solarCoordinates(julianDay(ut)) + val ut = ut0hOnDate(date) + val jd = julianDay(ut) + val longitudeNutation = nutationInLongitude(jd) + val eclipticObliquity = trueObliquityOfEcliptic(jd) + val sr = apparentSiderealTime(jd, longitudeNutation, eclipticObliquity) + val sun = solarCoordinates(jd) val times = riseSetTransitTimes( coordinate.latitude, coordinate.longitude, @@ -528,6 +531,22 @@ internal object Astro { private fun square(a: Double): Double { return a * a } + + + private fun ut0hOnDate(date: ZonedDateTime): LocalDateTime { + val localDate = date.toLocalDate() + + for (i in -1..1){ + val ut0h = ut(date.plusDays(i.toLong())).toLocalDate().atStartOfDay() + val local0h = utToLocal(ut0h, date.zone) + if (localDate == local0h.toLocalDate()){ + return ut0h + } + } + + return ut(date).toLocalDate().atStartOfDay() + } + } data class AstroCoordinates(val declination: Double, val rightAscension: Double) diff --git a/app/src/main/java/com/kylecorry/trailsensecore/domain/time/TimeExtensions.kt b/app/src/main/java/com/kylecorry/trailsensecore/domain/time/TimeExtensions.kt index 5f26b40f..8de0c83f 100644 --- a/app/src/main/java/com/kylecorry/trailsensecore/domain/time/TimeExtensions.kt +++ b/app/src/main/java/com/kylecorry/trailsensecore/domain/time/TimeExtensions.kt @@ -28,8 +28,8 @@ fun Instant.toZonedDateTime(): ZonedDateTime { fun LocalDateTime.plusHours(hours: Double): LocalDateTime { val h = hours.toLong() - val m = ((hours % 1) * 60).toLong() - val s = (hours * 60) % 1 + val m = (hours % 1) * 60 + val s = (m % 1) * 60 val ns = (1e9 * s).toLong() - return this.plusHours(h).plusMinutes(m).plusNanos(ns) + return this.plusHours(h).plusMinutes(m.toLong()).plusNanos(ns) } \ No newline at end of file diff --git a/app/src/test/java/com/kylecorry/trailsensecore/domain/astronomy/AstroTest.kt b/app/src/test/java/com/kylecorry/trailsensecore/domain/astronomy/AstroTest.kt index 17de783f..4a093993 100644 --- a/app/src/test/java/com/kylecorry/trailsensecore/domain/astronomy/AstroTest.kt +++ b/app/src/test/java/com/kylecorry/trailsensecore/domain/astronomy/AstroTest.kt @@ -240,4 +240,5 @@ class AstroTest { assertEquals(-7.78507, coords.declination, 0.0001) assertEquals(-161.61917, coords.rightAscension, 0.0001) } + } \ No newline at end of file