我搜索一种方法来计算给定时区(即位置)的日出和设置。我想要类似于Zend_Date的东西。
我们的想法是拥有一个应用程序,您可以在其中选择一个位置,并根据您获得的实际时间和日出时间设置。
干杯谢谢,
-lony
答案 0 :(得分:10)
查看sunrisesunsetlib-java,根据GPS坐标和日期计算日出/日落时间。
答案 1 :(得分:4)
计算日出和日落实际上是一个非常难以解决的问题,并且大多数声称使用它的图书馆使用的太简单的太阳系模型实际上并不能产生准确的结果。
地球围绕太阳和月球绕地球运行的轨道是不规则的,地球的自旋轴以两种不同的方式摆动(进动和章动),天文学家使用的时标不协调世界时(UTC)。最重要的是,大气折射扭曲了天体的感知位置(特别是在地平线附近);太阳和月亮的上升和设置通常由地平线上方的第一次出现而不是通过磁盘中心来定义;并且根据与观察者的距离,磁盘的感知大小会随时间变化。
我需要对我正在进行的项目进行精确的计算,并编写了一个库,其中包含了所有最先进的模型。
我们还为此提供了一个Web API,Web API和Java Library都可以在以下位置找到:
该网站还提供了许多取决于纬度和经度的其他信息。您可以在这里阅读图书馆的详细信息:
http://askgeo.com/database/Astronomy
库和Web API是商业用途,但我们可以免费访问Web API以符合合格的非营利组织,研究人员和开源项目。对于商业用户,定价信息位于:
提供日出和日落(以及其他内容)的图书馆是列表中的“天文学”。
答案 2 :(得分:4)
刚才,我发布了Time4J-v4.29,它也支持sunrise/sunset-calculations。例如:
SolarTime hamburg = SolarTime.ofLocation(53.55, 10.0);
Optional<Moment> result = PlainDate.nowInSystemTime().get(hamburg.sunrise());
System.out.println(result.get().toZonalTimestamp(() -> "Europe/Berlin"));
<强>爪哇-8-兼容性:强>
类SolarTime
(类型Moment
或PlainTimestamp
)的结果可以轻松转换为Java-8类型,如Instant
或LocalDateTime
,通常通过调用方法toTemporalAccessor()
。
关于算法:
主算法与NOAA使用的算法相同(主要区别在于Time4J也考虑了delta-T计算)。 NOAA算法(实际上与Jean Meeus开发的相同)比@dogbane的答案中提到的库sunrisesunsetlib使用的Williams算法更精确,特别是在极区附近或极区。但是,Time4J还通过指定计算器名称来支持Williams算法。这个简单的算法仍然可以在正常的地理位置使用,并且产生1-2分钟的精度。
其他功能:
还支持一些噱头,如蓝色小时,各种twilight definitions,阳光长度或确定极夜/午夜太阳或观察者高度的影响,请参阅API。
关于精确度的注意事项:
所以,我们应该始终牢记,山脉或特殊天气条件等拓扑事实对日出/日落的实际时间有很大影响,无法在任何支持日出/日落计算的图书馆中建模。
<强>机器人:强>
对于Android平台,请使用Time4A(Time4J的姐妹)优化资源访问。
答案 3 :(得分:0)
您可以使用此免费网络服务获取sunsrise and sunset times
它非常易于使用。它确实响应GMT中的时间,因此如果需要,您需要进行lat / lon到时区转换。