2011-02-08 20 views
9

私は、特定のタイムゾーン別名の場所のsunriseと-setを計算する方法を検索します。 Zend_Dateと似たようなものが欲しいです。日の出と日没をJavaで計算

アイデアは、場所を選択し、それに基づいて実際の時刻と日の出時刻を取得するアプリケーションを持つことです。

乾杯と感謝、
-lony

+1

質問はここで何ですか? –

+0

「Swingで」これを行う方法は、コマンドラインアプリケーション、サーブレット、Antタスク、または単体テストで行うのとまったく同じ方法です。 Javaを使用します。 'Swing'タグを削除します。 –

+0

質問は、日没と日の出を計算する方法です。それは何もスイングに関係なく真実だ、ネイトはすでにタグを削除した。 – lony

答えて

10

は、GPS座標と日から日の出/日の入りの時間を計算sunrisesunsetlib-javaを見てみましょう。

+0

ありがとう、私は縫い目が私が望むものになる。 – lony

+2

このライブラリは、日の出と日の入りを予測するための非常に単純なモデルを使用し、不正確な結果を与えます。それは多くのアプリケーションでは問題ありませんが、他の公開された情報源とは一致しません。正確なソリューションをお探しの場合は、別の場所で探すことをお勧めします。 –

4

日の出と日没を計算することは実際には非常に困難な問題であり、実際には正確な結果が得られない単純すぎる太陽系のモデルを使っていると主張するほとんどの図書館では、

地球の太陽と月についての軌道は不規則であり、地球のスピン軸は2つの異なる方法(歳差運動)で揺れ、天文学者によって使用される時間スケールは一致しない協定世界時(UTC)。その上、大気屈折は、天体の知覚される位置を歪ませます(特に、水平線の近く)。太陽と月の上昇と設定は、通常、ディスクの中心を通過するのではなく、水平線より上にあるディスクの最初の外観によって定義されます。ディスクの知覚されるサイズは、観察者からの距離に応じて時間とともに変化する。

私が取り組んでいたプロジェクトではこれを正確に計算する必要があり、すべての最先端モデルを組み込んだライブラリを作成しました。

我々はまた、このためのWeb APIを提供し、Web APIとJavaライブラリの両方がで見つけることができます。サイトはまた、緯度と経度に依存し、他の多くの情報を提供していること

http://askgeo.com/

。あなたはここにライブラリの詳細について読むことができます。

http://askgeo.com/database/Astronomy

ライブラリとウェブAPIは、市販されているが、我々は非営利団体、研究者、およびオープンソース・プロジェクトを修飾するためのWeb APIへの無料アクセスを提供します。

http://askgeo.com/#pricing

(とりわけ)日の出と日没を与えるライブラリ「天文学」リストの1つです:商用ユーザーの場合は、価格情報は、です。

+3

本当に有望ですが、オープンソースでなければなりません。それが完璧でなければならないことはそれほど重要ではありません。 5-10分の偏差があれば太陽の上昇と日没を計算することは難しいですか? – lony

+0

私が見たほとんどの方法は約10分で正確です。それで十分であれば、ライブラリについて気にする必要はありません。より細かいモデルが必要な分レベルの精度に落としたければそれです。ローカルトポロジ(地元の丘や山など)は日の出や日の入りに大きな影響を与えるため、私が見たモデルには含まれていないため、正確さはそれほど重要ではないと考えるのは簡単です。しかし、あなたの結果がユーザーに面している場合、あなたが確立された権限に同意しない場合、それは知覚される品質の問題です。 –

+0

良い点。ありがとう。 – lony

0

あなたはそれが非常に使いやすいですsunsrise and sunset times

を取得するには、この無料のWebサービスを使用することができます。それはGMTの時代に対応しているので、必要に応じて緯度/経度からタイムゾーンへの変換を行う必要があります。

2

ちょうど今、もサポートしているTime4J-v4.29を公開しました。例:

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互換:(タイプMoment又はPlainTimestampの)クラスSolarTime

結果が容易通常によって、Instant又はLocalDateTimeようなJava-8タイプに変換することができますメソッドtoTemporalAccessor()を呼び出します。アルゴリズムについて

メインアルゴリズムが(デルタT-計算もTime4Jによって考慮されることが主な違いで)NOAAによって使用されるものと同じです。 NOAAアルゴリズム(実際にはJean Meeusによって開発されたアルゴリズムと同じ)は、@ dogbaneの答えで言及されたライブラリsunrisesunsetlibによって、特に極域の近くまたは極地域で使用されるWilliamsアルゴリズムよりも正確です。しかし、Time4Jは計算機名を指定することでWilliamsアルゴリズムもサポートしています。この単純なアルゴリズムは、通常の地理的な場所では依然として使用可能で、1〜2分の精度が得られます。

その他の特徴:青時間、様々な夕暮れの定義、日差しの長さや極夜/真夜中の太陽やオブザーバー高度の影響を決定するよう

いくつかの仕掛けもサポートされ、APIを参照してください。精度について

注:

ので、これまで、我々は常に山や特殊な気象条件のようなトポロジーの事実は、日の出/日の入りの本当の倍に強い影響力を持っており、いずれにもモデル化することができないことを心に留めておくべきこと日の出/日没の計算をサポートするライブラリ

1

あなたは⩾7Java用commons-suncalc、依存関係のないライブラリを使用する場合があります

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());