Как кодировать алгоритм Shabbat Sunset для любой пятницы в Java?
Shabbat Sunset - это когда солнце на 8 ° ниже, чем горизонт, а затем на 18 минут раньше. < /p>
Этот вопрос был задан до < /strong> без результата, как написать альгорит без внешней библиотеки или веб -сервиса. Объяснение с этого сайта:
https://en.wikipedia.org/wiki/sunrise_e ... n_on_earth написанаpublic enum City
{
BERLIN("Berlin", "Germany", 52.52, 13.405, "Europe/Berlin", 34.0);
private String cityname;
private String countryname;
public double latitude;
public double longitude;
public String zoneId;
public double elevationInMeters;
City(String cityname, String countryname, double latitude, double longitude,
String zoneId, double elevationInMeters)
{
this.cityname = cityname;
this.countryname = countryname;
this.latitude = latitude;
this.longitude = longitude;
this.zoneId = zoneId;
this.elevationInMeters = elevationInMeters;
}
public String getInfo()
{
StringJoiner info = new StringJoiner(" ");
info.add(countryname);
info.add(cityname);
info.add(String.valueOf(latitude));
info.add(String.valueOf(longitude));
info.add(String.valueOf(zoneId));
return info.toString();
}
}
< /code>
и < /p>
package sunny;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Test
{
public static void main(String[] args)
{
City cityAsked = City.BERLIN;
LocalDateTime dayAsked = LocalDateTime.of(2025, 7, 25, 0, 0);
LocalDateTime start = LocalDateTime.of(2000, 1, 1, 12, 0);
double n = Duration.between(start, dayAsked).toDays(); // Julian day duration
double jStar = n - (cityAsked.longitude / 360.0); // mean solar time
double M = (357.5291 + 0.98560028 * jStar) % 360; // solar mean anomaly
double C = 1.9148 * Math.sin(M) + 0.0200 * Math.sin(2.0 * M)
+ 0.0003 * Math.sin(3.0 * M);// equation of the center
double lambda = (M + C + 180 + 102.9372) % 360;// ecliptic longitude
double jTransit = 2451545.0 + jStar + 0.0053 * Math.sin(M)
+ 0.0069 * Math.sin(2.0 * lambda); // solar transit = solar noon
double sinDelta = Math.sin(lambda) * Math.sin(23.4397); // declination of
// the sun
double cosOmegaNull = Math.sin(0.833+(-2.076*Math.sqrt(cityAsked.elevationInMeters)/60))
- Math.sin(cityAsked.latitude) * sinDelta; // hour angle
double omegaNull = Math.cos(cosOmegaNull);
double jSunset = jTransit + omegaNull / 360.0; // sunset in Julian days
double daysSunset = (long) jSunset;
double daysFraction = jSunset - daysSunset;
LocalDateTime result = dayAsked.plusMinutes((long) (daysFraction * 24.0 * 60.0));
ZonedDateTime adjustedResult = result.atZone(ZoneId.of("Europe/Berlin"));
LocalDateTime jewishSundown = LocalDateTime.from(result)
.minusMinutes((long) (adjustedResult.getOffset().getTotalSeconds() / 60.0)).minusMinutes(18L);
System.out.println(n);
System.out.println(jSunset);
System.out.println(daysSunset);
System.out.println(daysFraction);
System.out.println(result);
System.out.println(adjustedResult);
System.out.println(jewishSundown);
}
}
< /code>
Код приводит к немного раз, что, конечно, недостаточно.
Для сравнения: < /p>
11 июля Sunset = световые свечи 21:08
my code: 20:52 Ohcclock < /p>
< /> < /p>
< /> < /p>
< /> < /p>
package sunny;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Test
{
public static void main(String[] args)
{
City cityAsked = City.BERLIN;
LocalDateTime dayAsked = LocalDateTime.of(2025, 7, 25, 0, 0);
LocalDateTime start = LocalDateTime.of(2000, 1, 1, 12, 0);
double n = Duration.between(start, dayAsked).toDays(); // Julian day duration
double jStar = n - (cityAsked.longitude / 360.0); // mean solar time
double M = (357.5291 + 0.98560028 * jStar) % 360; // solar mean anomaly
double C = 1.9148 * Math.sin(Math.toRadians(M)) + 0.0200 * Math.sin(Math.toRadians(2.0 * M))
+ 0.0003 * Math.sin(3.0 * M);// equation of the center
double lambda = (M + C + 180 + 102.9372) % 360;// ecliptic longitude
double jTransit = 2451545.0 + jStar + 0.0053 * Math.sin(Math.toRadians(M))
+ 0.0069 * Math.sin(Math.toRadians(2.0 * lambda)); // solar transit = solar noon
double sinDelta = Math.sin(Math.toRadians(lambda)) * Math.sin(Math.toRadians(23.4397)); // declination of
// the sun
double cosOmegaNull = Math.sin(Math.toRadians(0.833+(-2.076*Math.sqrt(cityAsked.elevationInMeters)/60)))
- Math.sin(Math.toRadians(cityAsked.latitude)) * sinDelta; // hour angle
double omegaNull = Math.cos(Math.toRadians(cosOmegaNull));
double jSunset = jTransit + omegaNull / 360.0; // sunset in Julian days
double daysSunset = (long) jSunset;
double daysFraction = jSunset - daysSunset;
LocalDateTime result = dayAsked.plusMinutes((long) (daysFraction * 24.0 * 60.0));
ZonedDateTime adjustedResult = result.atZone(ZoneId.of("Europe/Berlin"));
LocalDateTime jewishSundown = LocalDateTime.from(result)
.minusMinutes((long) (adjustedResult.getOffset().getTotalSeconds() / 60.0)).minusMinutes(18L);
System.out.println(n);
System.out.println(jSunset);
System.out.println(daysSunset);
System.out.println(daysFraction);
System.out.println(result);
System.out.println(adjustedResult);
System.out.println(jewishSundown);
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... ay-in-java
Как кодировать алгоритм Shabbat Sunset для любой пятницы в Java? ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение