用java计算日出日落

用java计算日出日落,java,date,timezone,Java,Date,Timezone,我搜索一种方法来计算日出,并为给定的时区或位置设置。我想要类似的 其想法是有一个应用程序,您可以选择一个位置,并根据该位置获得实际时间和日出时间 干杯,谢谢, -lony看看哪种方法可以根据GPS坐标和日期计算日出/日落时间。计算日出和日落实际上是一个很难解决的问题,大多数声称这样做的图书馆使用的太阳系模型过于简单,实际上无法产生准确的结果 地球绕太阳的轨道和月球绕地球的轨道是不规则的,地球自转轴以两种不同的方式摆动(进动和章动),天文学家使用的时间尺度与协调世界时(UTC)不一致。除此之外,大

我搜索一种方法来计算日出,并为给定的时区或位置设置。我想要类似的

其想法是有一个应用程序,您可以选择一个位置,并根据该位置获得实际时间和日出时间

干杯,谢谢,

-lony

看看哪种方法可以根据GPS坐标和日期计算日出/日落时间。

计算日出和日落实际上是一个很难解决的问题,大多数声称这样做的图书馆使用的太阳系模型过于简单,实际上无法产生准确的结果

地球绕太阳的轨道和月球绕地球的轨道是不规则的,地球自转轴以两种不同的方式摆动(进动和章动),天文学家使用的时间尺度与协调世界时(UTC)不一致。除此之外,大气折射会扭曲天体的感知位置(尤其是在地平线附近);太阳和月亮的升起和落下通常由圆盘在地平线上的首次出现而不是圆盘中心的通过来定义;磁盘的感知大小随着时间的推移而变化,这取决于它与观察者的距离

我需要对我正在进行的一个项目进行精确的计算,并为此编写了一个库,其中包含了所有最先进的模型

我们还为此提供了web API,web API和Java库可在以下网址找到:

该网站还提供了许多其他信息,这些信息取决于纬度和经度。您可以在此处阅读有关该库的详细信息:

该库和web API是商业性的,但我们允许符合条件的非营利组织、研究人员和开源项目免费访问web API。对于商业用户,定价信息位于:


提供日出和日落(以及其他内容)的库是列表中的“天文学”库。

您可以使用此免费Web服务获取

它很容易使用。它的响应时间以GMT为单位,因此如果需要,您需要进行从lat/lon到时区的转换。

刚才,我发布了一个也支持lat/lon的版本。例如:

 SolarTime hamburg = SolarTime.ofLocation(53.55, 10.0);
 Optional<Moment> result = PlainDate.nowInSystemTime().get(hamburg.sunrise());
 System.out.println(result.get().toZonalTimestamp(() -> "Europe/Berlin"));
SolarTime-hamburg=SolarTime.ofLocation(53.55,10.0);
可选结果=PlainDate.nowInSystemTime().get(hamburg.sunrise());
System.out.println(result.get().toZonalTimestamp(()->“欧洲/柏林”);
Java-8-兼容性:

SolarTime
(类型为
Moment
PlainTimestamp
)的结果可以很容易地转换为Java-8类型,如
Instant
LocalDateTime
,通常通过调用方法
toTemporalAccessor()

关于算法:

主算法与所使用的相同(主要区别在于,Time4J也考虑了delta-T计算)。NOAA算法(实际上与Jean Meeus开发的算法相同)比@dogbane答案中提到的Sunsetlib图书馆使用的Williams算法更精确,尤其是在极地附近或极地地区。但是,Time4J还通过指定计算器名称来支持Williams算法。这个简单的算法仍然适用于正常地理位置,并产生1-2分钟的精度

其他功能:

一些噱头,如蓝色小时,各种各样,日照长度或确定极夜/午夜太阳或观察员海拔高度的影响,也得到支持,见API

关于精度的注意事项:

无论如何,我们应该始终记住,地形事实(如山脉或特殊天气条件)对日出/日落的真实时间有很大影响,并且不能在任何支持日出/日落计算的库中建模

Android:

对于Android平台,请使用(Time4J的姐妹)优化资源访问。

您可能需要使用一个无依赖性的Java库⩾7:

Date date = // date of calculation
double lat, lng = // geolocation
SunTimes times = SunTimes.compute()
            .on(date)       // set a date
            .at(lat, lng)   // set a location
            .execute();     // get the results
System.out.println("Sunrise: " + times.getRise());
System.out.println("Sunset: " + times.getSet());

“在Swing”中执行此操作的方式与在命令行应用程序、servlet、ant任务或单元测试中执行此操作的方式完全相同。使用Java。移除“摇摆”标签。问题是如何计算日落和日出。的确,这与摇摆无关,Nate已经移除了标签。谢谢,这就是我想要的。这个库使用一个非常简单的模型来预测日出和日落,并且会给出不准确的结果。这对于许多应用程序来说都很好,但它与其他已发布的源代码不一致。如果您正在寻找一个准确的解决方案,我建议您去别处看看。Mike Reedell的这个库对于大多数用例来说都足够准确。就我而言,时间与Windows天气应用程序中的时间相同。它也是免费的。直接链接到github:看起来很有希望,但必须是开源的。完美并不重要。如果5-10分钟的偏差是可以的,那么计算太阳的升起和日落会很困难吗?我见过的大多数方法都精确到10分钟左右,所以如果这对你来说足够了,那么你就不需要对库挑剔了。如果你想达到亚分钟级的精度,你需要更好的模型。由于局部拓扑(例如,局部山丘/山脉)对日出和日落有巨大的影响,并且我所看到的任何模型都不包括局部拓扑,因此很容易假设精度并不重要。但是如果你的结果是面向用户的,那么如果你的结果不符合权威的话,这就是一个感知质量的问题。Time4J库通过时间函数是很好的。但是,我们能用Time4J计算航海或天文日出/日落吗?我找不到这方面的任何来源。@tekinbeyaz要计算航海或日出/日落,只需调用重载方法
sunrise(twillight)
resp<代码>太阳