【问题标题】:Calculating sunrise and sunset with java用java计算日出和日落
【发布时间】:2011-06-23 14:03:24
【问题描述】:

我寻找一种计算日出的方法,并为给定的时区(即位置)设置 -set。我想要类似于Zend_Date 的东西。

我们的想法是有一个应用程序,您可以在其中选择一个位置,并根据该应用程序获得实际时间以及日出,设置时间。

干杯,谢谢,
-孤独

【问题讨论】:

  • 在 Swing 中执行此操作的方式与在命令行应用程序、servlet、ant 任务或单元测试中执行此操作的方式完全相同。使用 Java。删除“Swing”标签。
  • 问题是如何计算日落和日出。确实与摇摆无关,Nate 已经删除了标签。

标签: java date timezone


【解决方案1】:

查看sunrisesunsetlib-java,它根据 GPS 坐标和日期计算日出/日落时间。

【讨论】:

  • 谢谢,这就是我想要的。
  • 这个库使用一个非常简单的模型来预测日出和日落,并且会给出不准确的结果。这对许多应用程序来说都很好,但它会与其他已发布的来源不一致。如果您正在寻找准确的解决方案,我建议您寻找其他地方。
  • Mike Reedell 的这个库对于大多数用例来说足够准确。就我而言,时间与 Windows 天气应用程序中的时间相同。它也是免费的。直接链接到github:github.com/mikereedell/sunrisesunsetlib-java
【解决方案2】:

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

地球绕太阳的轨道和月球绕地球的轨道是不规则的,地球的自转轴以两种不同的方式摆动(岁差和章动),天文学家使用的时间尺度与协调不一致世界标准时间 (UTC)。最重要的是,大气折射会扭曲天体的感知位置(尤其是在地平线附近);太阳和月亮的升起和落下通常由圆盘在地平线上方的第一次出现来定义,而不是圆盘中心的经过;并且感知到的圆盘大小会根据其与观察者的距离而随时间变化。

我需要对我正在从事的项目进行准确计算,并编写了一个库来执行此操作,该库包含所有最先进的模型。

我们还为此提供了一个 Web API,Web API 和 Java 库都可以在以下位置找到:

http://askgeo.com/

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

http://askgeo.com/database/Astronomy

库和 Web API 是商业用途,但我们向符合条件的非营利组织、研究人员和开源项目免费提供 Web API 访问权限。对于商业用户,定价信息位于:

http://askgeo.com/#pricing

提供日出和日落(除其他外)的图书馆是列表中的“天文学”图书馆。

【讨论】:

  • 看起来很有前途,但它必须是开源的。它必须是完美的并不重要。如果5-10分钟的偏差还可以,是不是还很难计算日出日落?
  • 我见过的大多数方法都可以精确到大约 10 分钟,所以如果这对你来说足够了,那么你就不需要对库挑剔了。如果您想达到亚分钟级别的精度,您需要更好的模型。由于局部拓扑(例如,局部丘陵/山脉)对日出和日落有巨大影响,并且不包含在我见过的任何模型中,因此很容易假设准确性并不重要。但是,如果您的结果是面向用户的,那么如果您的结果不符合既定权威,那就是感知质量问题。
【解决方案3】:

您可以使用这个免费的网络服务来获取sunsrise and sunset times

它非常易于使用。它会响应 GMT 时间,因此如果需要,您需要进行纬度/经度到时区的转换。

【讨论】:

    【解决方案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"));
    

    Java-8 兼容性:

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

    关于算法:

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

    其他功能:

    还支持一些噱头,如蓝色小时、各种twilight definitions、日照长度或确定极夜/午夜太阳或观察者高度的影响,请参阅 API。

    关于精度的注意事项:

    无论如何,我们应该始终牢记,山脉或特殊天气条件等拓扑事实对日出/日落的实时时间有很大影响,并且无法在任何支持日出/日落计算的库中建模。

    安卓:

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

    【讨论】:

    • Time4J 库在时间函数方面非常出色。但是,我们可以使用 Time4J 计算航海或天文日出/日落吗?我找不到任何关于此的消息来源。
    • @tekinbeyaz 要计算航海或astronomical 日出/日落,只需调用重载方法sunrise(Twilight) resp。 sunset(Twilight) 使用适当的 Twilight-enum。如果需要其他角度定义,那么您也可以使用低级 API 接口 SolarTime.Calculator 及其在 StdSolarCalculator 中的实现之一(例如,用于犹太祈祷时间)。
    【解决方案5】:

    您可能想要使用commons-suncalc,这是一个适用于 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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多