From 42650bd341385b00ffcd456c252fda38cc5d1146 Mon Sep 17 00:00:00 2001 From: Don Cross Date: Sun, 12 Feb 2023 20:01:05 -0500 Subject: [PATCH] Java: added true solar time demo --- demo/java/correct/solar_time.txt | 1 + demo/java/demotest | 1 + demo/java/demotest.bat | 1 + .../cosinekitty/astronomy/demo/Main.java | 10 +++++++ .../cosinekitty/astronomy/demo/SolarTime.java | 29 +++++++++++++++++++ 5 files changed, 42 insertions(+) create mode 100644 demo/java/correct/solar_time.txt create mode 100644 demo/java/src/main/java/io/github/cosinekitty/astronomy/demo/SolarTime.java diff --git a/demo/java/correct/solar_time.txt b/demo/java/correct/solar_time.txt new file mode 100644 index 00000000..f0e2d576 --- /dev/null +++ b/demo/java/correct/solar_time.txt @@ -0,0 +1 @@ +True solar time = 11.6286 hours (11:37:42.979) diff --git a/demo/java/demotest b/demo/java/demotest index 62455d0c..10b86ba5 100755 --- a/demo/java/demotest +++ b/demo/java/demotest @@ -19,6 +19,7 @@ if ! ./gradlew jar test; then exit 1 fi +TestDemo solar_time +38.88 -77.03 2023-02-12T17:00:00Z TestDemo constellation 2021-06-01T00:00:00Z TestDemo jupiter_moons 2021-04-16T00:26:18Z TestDemo lunar_eclipse 1988-01-01T00:00:00Z diff --git a/demo/java/demotest.bat b/demo/java/demotest.bat index 92f9d2d1..1d040b8a 100644 --- a/demo/java/demotest.bat +++ b/demo/java/demotest.bat @@ -11,6 +11,7 @@ call gradlew.bat jar test || exit /b 1 REM ---------------------------------------------------------------------------------- +call :TestDemo solar_time +38.88 -77.03 2023-02-12T17:00:00Z || exit /b 1 call :TestDemo constellation 2021-06-01T00:00:00Z || exit /b 1 call :TestDemo jupiter_moons 2021-04-16T00:26:18Z || exit /b 1 call :TestDemo lunar_eclipse 1988-01-01T00:00:00Z || exit /b 1 diff --git a/demo/java/src/main/java/io/github/cosinekitty/astronomy/demo/Main.java b/demo/java/src/main/java/io/github/cosinekitty/astronomy/demo/Main.java index 5559d905..5f71689f 100644 --- a/demo/java/src/main/java/io/github/cosinekitty/astronomy/demo/Main.java +++ b/demo/java/src/main/java/io/github/cosinekitty/astronomy/demo/Main.java @@ -60,6 +60,10 @@ public class Main { " seasons year", " Given an integer year number, displays the solstices and equinoxes for that year.", " The year must be in the range 0000..9999.", + "", + " solar_time latitude longitude [yyyy-mm-ddThh:mm:ssZ]", + " Displays the true solar time for the observer at the", + " given geographic coordinates.", "" ); @@ -198,6 +202,12 @@ public Demo(String name, int minArgs, int maxArgs, DemoRunner runner) { Seasons.run( parseYear(args[1]) ) + ), + new Demo("solar_time", 3, 4, args -> + SolarTime.run( + parseObserver(args, 1), + parseTime(args, 3) + ) ) ); } diff --git a/demo/java/src/main/java/io/github/cosinekitty/astronomy/demo/SolarTime.java b/demo/java/src/main/java/io/github/cosinekitty/astronomy/demo/SolarTime.java new file mode 100644 index 00000000..c2454688 --- /dev/null +++ b/demo/java/src/main/java/io/github/cosinekitty/astronomy/demo/SolarTime.java @@ -0,0 +1,29 @@ +package io.github.cosinekitty.astronomy.demo; +import io.github.cosinekitty.astronomy.*; + +public class SolarTime { + /** + * Display true solar time for a given geographic location at a given time. + * + * @param observer + * The geographic location for which to calculate true solar time. + * + * @param time + * The date and time for which to calculate true solar time. + */ + public static int run(Observer observer, Time time) { + double ha = Astronomy.hourAngle(Body.Sun, time, observer); + double solarTimeHours = (ha + 12.0) % 24.0; + int milli = (int) Math.round(solarTimeHours * 3.6e+6); + int second = milli / 1000; + milli %= 1000; + int minute = second / 60; + second %= 60; + int hour = minute / 60; + minute %= 60; + hour %= 24; + + System.out.printf("True solar time = %7.4f hours (%02d:%02d:%02d.%03d)%n", solarTimeHours, hour, minute, second, milli); + return 0; + } +}