Я попытался использовать объяснение с этого сайта:
https://en.wikipedia.org/wiki/sunrise_e ... culate_ons.> мой код до сих пор. < /p>
Код: Выделить всё
package sunny;
import java.util.StringJoiner;
public enum City
{
BERLIN("Berlin", "Germany", "52.52", "13.405", "Europe/Berlin", "34");
private String cityname;
private String countryname;
public String latitude;
public String longitude;
public String zoneId;
public String elevationInMeters;
City(String cityname, String countryname, String latitude, String longitude,
String zoneId, String 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.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class TestBigDecimal
{
public static void main(String[] args)
{
City cityAsked = City.BERLIN;
LocalDateTime dayAsked = LocalDateTime.of(2025, 7, 18, 0, 0);
LocalDateTime start = LocalDateTime.of(2000, 1, 1, 12, 0);
BigDecimal n = new BigDecimal(Duration.between(start, dayAsked).toDays()); // Julian
// day
// duration
BigDecimal jStar = n.subtract(new BigDecimal(cityAsked.longitude)
.divide(new BigDecimal("360"), 8, RoundingMode.HALF_UP)); // mean
// solar
// time
BigDecimal M = (new BigDecimal("357.5291")
.add(new BigDecimal("0.98560028").multiply(jStar)))
.remainder(new BigDecimal("360")); // solar mean anomaly
BigDecimal C = (new BigDecimal("1.9148")
.multiply(new BigDecimal(Math.sin(M.doubleValue())).add(
new BigDecimal("0.0200").multiply(new BigDecimal(Math.sin(
M.multiply(new BigDecimal("2")).doubleValue())).add(
new BigDecimal("0.0003").multiply(new BigDecimal(
Math.sin(M.multiply(new BigDecimal("3"))
.doubleValue()))))))));// equation of
// the center
BigDecimal lambda = (M.add(C).add(new BigDecimal("180"))
.add(new BigDecimal("102.9372")).remainder(new BigDecimal("360")));// ecliptic
// longitude
BigDecimal jTransit = new BigDecimal("2451545").add(jStar)
.add(new BigDecimal("0.0053")
.multiply(new BigDecimal(Math.sin(M.doubleValue())))
.add(new BigDecimal("0.0069")
.multiply(new BigDecimal(Math.sin(lambda
.multiply(new BigDecimal("2")).doubleValue()))))); // solar
// transit
// =
// solar
// noon
BigDecimal sinDelta = new BigDecimal(Math.sin(lambda.doubleValue()))
.multiply(new BigDecimal(Math.sin(23.4397))); // declination of
// the sun
BigDecimal cosOmegaNull = new BigDecimal(Math.sin(new BigDecimal("0.833")
.add(new BigDecimal("-2.076")
.multiply(new BigDecimal(cityAsked.elevationInMeters)
.sqrt(MathContext.DECIMAL32))
.divide(new BigDecimal("60"), 8, RoundingMode.HALF_UP))
.doubleValue())).subtract(
new BigDecimal(Math.sin(Double.valueOf(cityAsked.latitude))))
.multiply(sinDelta); // hour angle
BigDecimal omegaNull = new BigDecimal(
Math.cos(cosOmegaNull.doubleValue()));
BigDecimal jSunset = jTransit.add(
omegaNull.divide(new BigDecimal("360"), 8, RoundingMode.HALF_UP)); // sunset
// in
// Julian
// days
BigDecimal daysSunset = new BigDecimal(jSunset.toBigInteger().toString());
BigDecimal daysFraction = jSunset.subtract(daysSunset);
LocalDateTime result = dayAsked.plusMinutes(daysFraction
.multiply(new BigDecimal("24").multiply(new BigDecimal("60")))
.longValue());
ZonedDateTime adjustedResult = result.atZone(ZoneId.of("Europe/Berlin"));
LocalDateTime jewishSundown = LocalDateTime.from(result)
.minusMinutes(
new BigDecimal(adjustedResult.getOffset().getTotalSeconds())
.divide(new BigDecimal("60")).longValue())
.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