与えられた日に太陽が沈みそして昇るときに与えられた緯度と経度を計算するC#の方法はありますか?
私はこの投稿が古いことを知っていますが、誰かがまだ見ている場合に備えて...
CoordinateSharp はNugetパッケージとして利用できます。これはスタンドアロンのパッケージであり、月の時間だけでなく太陽の時間も処理できます。
Celestial cel = Celestial.CalculateCelestialTimes(85.57682, -70.75678, new DateTime(2017,8,21));
Console.WriteLine(cel.SunRise.Value.ToString());
注意:
DateTimeは常にUTCであると想定しています。
最後に、日付がnullを返す場合、CelestialオブジェクトのSun/Moon .Condition
を参照する必要があるかもしれません。これは、太陽が一日中上昇/下降しているときに発生します。
編集1/9/2019
この投稿以降、ライブラリは劇的に変化しました。現地時間にも対応できるようになりました。
NAA javascriptとc#を使用して、C#でこのライブラリを作成しました。
私はこれら2つのサイトに対してそれをテストしました、そしてそれはサイトがするのと全く同じように時間を示しています。
このAPIは私にとってはうまくいくようです:
これに対する受け入れられた答えはJavaScript実装でしたが、C#で計算を行う必要があるため、私のアプリケーションには適していませんでした。
私はこのC#コードを使用しました: http://wiki.crowe.co.nz/Calculate%20Sunrise%2fSunset.ashx 、これは私がここで日の出/日没時間に対して検証したものです-- http://www.timeanddate.com/astronomy/ 。
秒を最も近い分に四捨五入すると、C#実装の日の出および日の入り時刻は、夏時間の場合も含めて、timeanddate.comに表示される対応する値と一致します。ただし、このコードは少し面倒です(月相データも必要な場合を除く)。そのため、特に必要なことを実行するためにコードをリファクタリングして、数値が正しいようにします。
Dotaの回答のVB.Netバージョン。タイムゾーンを自動的に決定することもできます。
出力(今夜の夕日を見て確認):
Main.VB:
Module Main
Sub Main()
' http://www.timeanddate.com/Sun/usa/seattle
' http://www.esrl.noaa.gov/gmd/grad/solcalc/
' Vessy, Switzerland
Dim latitude As Double = 46.17062
Dim longitude As Double = 6.161667
Dim dst As Boolean = True
Dim timehere As DateTime = DateTime.Now
Console.WriteLine("It is currently {0:HH:mm:ss} UTC", DateTime.UtcNow)
Console.WriteLine("The time here, at {0}°,{1}° is {2:HH:mm:ss}", latitude, longitude, timehere)
Dim local As TimeZoneInfo = TimeZoneInfo.Local
Dim zone As Integer = local.BaseUtcOffset().TotalHours
If local.SupportsDaylightSavingTime Then
Dim standard As String = local.StandardName
Dim daylight As String = local.DaylightName
dst = local.IsDaylightSavingTime(timehere)
Dim current As String = IIf(dst, daylight, standard)
Console.WriteLine("Daylight-saving time is supported here. Current offset {0:+0} hours, {1}", zone, current)
Else
Console.WriteLine("Daylight-saving time is not supported here")
End If
System.Console.WriteLine("Sunrise today {0}", Sunrises(latitude, longitude))
System.Console.WriteLine("Sunset today {0}", Sunsets(latitude, longitude))
System.Console.ReadLine()
End Sub
End Module
Sun.vb:
Public Module Sun
' Get sunrise time at latitude, longitude using local system timezone
Function Sunrises(latitude As Double, longitude As Double) As DateTime
Dim julian As Double = JulianDay(DateTime.Now)
Dim rises As Double = SunRiseUTC(julian, latitude, longitude)
Dim timehere As DateTime = DateTime.Now
Dim local As TimeZoneInfo = TimeZoneInfo.Local
Dim dst As Boolean = local.IsDaylightSavingTime(timehere)
Dim zone As Integer = local.BaseUtcOffset().TotalHours
Dim result As DateTime = getDateTime(rises, zone, timehere, dst)
Return result
End Function
' Get sunset time at latitude, longitude using local system timezone
Function Sunsets(latitude As Double, longitude As Double) As DateTime
Dim julian As Double = JulianDay(DateTime.Now)
Dim rises As Double = SunSetUTC(julian, latitude, longitude)
Dim timehere As DateTime = DateTime.Now
Dim local As TimeZoneInfo = TimeZoneInfo.Local
Dim dst As Boolean = local.IsDaylightSavingTime(timehere)
Dim zone As Integer = local.BaseUtcOffset().TotalHours
Dim result As DateTime = getDateTime(rises, zone, timehere, dst)
Return result
End Function
' Convert radian angle to degrees
Public Function Degrees(angleRad As Double) As Double
Return (180.0 * angleRad / Math.PI)
End Function
' Convert degree angle to radians
Public Function Radians(angleDeg As Double) As Double
Return (Math.PI * angleDeg / 180.0)
End Function
'* Name: JulianDay
'* Type: Function
'* Purpose: Julian day from calendar day
'* Arguments:
'* year : 4 digit year
'* month: January = 1
'* day : 1 - 31
'* Return value:
'* The Julian day corresponding to the date
'* Note:
'* Number is returned for start of day. Fractional days should be
'* added later.
Public Function JulianDay(year As Integer, month As Integer, day As Integer) As Double
If month <= 2 Then
year -= 1
month += 12
End If
Dim A As Double = Math.Floor(year / 100.0)
Dim B As Double = 2 - A + Math.Floor(A / 4)
Dim julian As Double = Math.Floor(365.25 * (year + 4716)) + Math.Floor(30.6001 * (month + 1)) + day + B - 1524.5
Return julian
End Function
Public Function JulianDay([date] As DateTime) As Double
Return JulianDay([date].Year, [date].Month, [date].Day)
End Function
'***********************************************************************/
'* Name: JulianCenturies
'* Type: Function
'* Purpose: convert Julian Day to centuries since J2000.0.
'* Arguments:
'* julian : the Julian Day to convert
'* Return value:
'* the T value corresponding to the Julian Day
'***********************************************************************/
Public Function JulianCenturies(julian As Double) As Double
Dim T As Double = (julian - 2451545.0) / 36525.0
Return T
End Function
'***********************************************************************/
'* Name: JulianDayFromJulianCentury
'* Type: Function
'* Purpose: convert centuries since J2000.0 to Julian Day.
'* Arguments:
'* t : number of Julian centuries since J2000.0
'* Return value:
'* the Julian Day corresponding to the t value
'***********************************************************************/
Public Function JulianDayFromJulianCentury(t As Double) As Double
Dim julian As Double = t * 36525.0 + 2451545.0
Return julian
End Function
'***********************************************************************/
'* Name: calGeomMeanLongSun
'* Type: Function
'* Purpose: calculate the Geometric Mean Longitude of the Sun
'* Arguments:
'* t : number of Julian centuries since J2000.0
'* Return value:
'* the Geometric Mean Longitude of the Sun in degrees
'***********************************************************************/
Public Function GemoetricMeanLongitude(t As Double) As Double
Dim L0 As Double = 280.46646 + t * (36000.76983 + 0.0003032 * t)
While L0 > 360.0
L0 -= 360.0
End While
While L0 < 0.0
L0 += 360.0
End While
Return L0
' in degrees
End Function
'***********************************************************************/
'* Name: calGeomAnomalySun
'* Type: Function
'* Purpose: calculate the Geometric Mean Anomaly of the Sun
'* Arguments:
'* t : number of Julian centuries since J2000.0
'* Return value:
'* the Geometric Mean Anomaly of the Sun in degrees
'***********************************************************************/
Public Function GemoetricMeanAnomaly(t As Double) As Double
Dim M As Double = 357.52911 + t * (35999.05029 - 0.0001537 * t)
Return M
' in degrees
End Function
'***********************************************************************/
'* Name: EarthOrbitEccentricity
'* Type: Function
'* Purpose: calculate the eccentricity of earth's orbit
'* Arguments:
'* t : number of Julian centuries since J2000.0
'* Return value:
'* the unitless eccentricity
'***********************************************************************/
Public Function EarthOrbitEccentricity(t As Double) As Double
Dim e As Double = 0.016708634 - t * (0.000042037 + 0.0000001267 * t)
Return e
' unitless
End Function
'***********************************************************************/
'* Name: SunCentre
'* Type: Function
'* Purpose: calculate the equation of center for the Sun
'* Arguments:
'* t : number of Julian centuries since J2000.0
'* Return value:
'* in degrees
'***********************************************************************/
Public Function SunCentre(t As Double) As Double
Dim m As Double = GemoetricMeanAnomaly(t)
Dim mrad As Double = Radians(m)
Dim sinm As Double = Math.Sin(mrad)
Dim sin2m As Double = Math.Sin(mrad + mrad)
Dim sin3m As Double = Math.Sin(mrad + mrad + mrad)
Dim C As Double = sinm * (1.914602 - t * (0.004817 + 0.000014 * t)) + sin2m * (0.019993 - 0.000101 * t) + sin3m * 0.000289
Return C
' in degrees
End Function
'***********************************************************************/
'* Name: SunTrueLongitude
'* Type: Function
'* Purpose: calculate the true longitude of the Sun
'* Arguments:
'* t : number of Julian centuries since J2000.0
'* Return value:
'* Sun's true longitude in degrees
'***********************************************************************/
Public Function SunTrueLongitude(t As Double) As Double
Dim l0 As Double = GemoetricMeanLongitude(t)
Dim c As Double = SunCentre(t)
Dim O As Double = l0 + c
Return O
' in degrees
End Function
'***********************************************************************/
'* Name: SunTrueAnomaly
'* Type: Function
'* Purpose: calculate the true anamoly of the Sun
'* Arguments:
'* t : number of Julian centuries since J2000.0
'* Return value:
'* Sun's true anamoly in degrees
'***********************************************************************/
Public Function SunTrueAnomaly(t As Double) As Double
Dim m As Double = GemoetricMeanAnomaly(t)
Dim c As Double = SunCentre(t)
Dim v As Double = m + c
Return v
' in degrees
End Function
'***********************************************************************/
'* Name: SunDistanceAU
'* Type: Function
'* Purpose: calculate the distance to the Sun in AU
'* Arguments:
'* t : number of Julian centuries since J2000.0
'* Return value:
'* Sun radius vector in AUs
'***********************************************************************/
Public Function SunDistanceAU(t As Double) As Double
Dim v As Double = SunTrueAnomaly(t)
Dim e As Double = EarthOrbitEccentricity(t)
Dim R As Double = (1.000001018 * (1 - e * e)) / (1 + e * Math.Cos(Radians(v)))
Return R
' in AUs
End Function
'***********************************************************************/
'* Name: SunApparentLongitude
'* Type: Function
'* Purpose: calculate the apparent longitude of the Sun
'* Arguments:
'* t : number of Julian centuries since J2000.0
'* Return value:
'* Sun's apparent longitude in degrees
'***********************************************************************/
Public Function SunApparentLongitude(t As Double) As Double
Dim o As Double = SunTrueLongitude(t)
Dim omega As Double = 125.04 - 1934.136 * t
Dim lambda As Double = o - 0.00569 - 0.00478 * Math.Sin(Radians(omega))
Return lambda
' in degrees
End Function
'***********************************************************************/
'* Name: MeanObliquityOfEcliptic
'* Type: Function
'* Purpose: calculate the mean obliquity of the ecliptic
'* Arguments:
'* t : number of Julian centuries since J2000.0
'* Return value:
'* mean obliquity in degrees
'***********************************************************************/
Public Function MeanObliquityOfEcliptic(t As Double) As Double
Dim seconds As Double = 21.448 - t * (46.815 + t * (0.00059 - t * (0.001813)))
Dim e0 As Double = 23.0 + (26.0 + (seconds / 60.0)) / 60.0
Return e0
' in degrees
End Function
'***********************************************************************/
'* Name: calcObliquityCorrection
'* Type: Function
'* Purpose: calculate the corrected obliquity of the ecliptic
'* Arguments:
'* t : number of Julian centuries since J2000.0
'* Return value:
'* corrected obliquity in degrees
'***********************************************************************/
Public Function calcObliquityCorrection(t As Double) As Double
Dim e0 As Double = MeanObliquityOfEcliptic(t)
Dim omega As Double = 125.04 - 1934.136 * t
Dim e As Double = e0 + 0.00256 * Math.Cos(Radians(omega))
Return e
' in degrees
End Function
'***********************************************************************/
'* Name: SunRightAscension
'* Type: Function
'* Purpose: calculate the right ascension of the Sun
'* Arguments:
'* t : number of Julian centuries since J2000.0
'* Return value:
'* Sun's right ascension in degrees
'***********************************************************************/
Public Function SunRightAscension(t As Double) As Double
Dim e As Double = calcObliquityCorrection(t)
Dim lambda As Double = SunApparentLongitude(t)
Dim tananum As Double = (Math.Cos(Radians(e)) * Math.Sin(Radians(lambda)))
Dim tanadenom As Double = (Math.Cos(Radians(lambda)))
Dim alpha As Double = Degrees(Math.Atan2(tananum, tanadenom))
Return alpha
' in degrees
End Function
'***********************************************************************/
'* Name: SunDeclination
'* Type: Function
'* Purpose: calculate the declination of the Sun
'* Arguments:
'* t : number of Julian centuries since J2000.0
'* Return value:
'* Sun's declination in degrees
'***********************************************************************/
Public Function SunDeclination(t As Double) As Double
Dim e As Double = calcObliquityCorrection(t)
Dim lambda As Double = SunApparentLongitude(t)
Dim sint As Double = Math.Sin(Radians(e)) * Math.Sin(Radians(lambda))
Dim theta As Double = Degrees(Math.Asin(sint))
Return theta
' in degrees
End Function
'***********************************************************************/
'* Name: TrueSolarToMeanSolar
'* Type: Function
'* Purpose: calculate the difference between true solar time and mean
'* solar time
'* Arguments:
'* t : number of Julian centuries since J2000.0
'* Return value:
'* equation of time in minutes of time
'***********************************************************************/
Public Function TrueSolarToMeanSolar(t As Double) As Double
Dim epsilon As Double = calcObliquityCorrection(t)
Dim l0 As Double = GemoetricMeanLongitude(t)
Dim e As Double = EarthOrbitEccentricity(t)
Dim m As Double = GemoetricMeanAnomaly(t)
Dim y As Double = Math.Tan(Radians(epsilon) / 2.0)
y *= y
Dim sin2l0 As Double = Math.Sin(2.0 * Radians(l0))
Dim sinm As Double = Math.Sin(Radians(m))
Dim cos2l0 As Double = Math.Cos(2.0 * Radians(l0))
Dim sin4l0 As Double = Math.Sin(4.0 * Radians(l0))
Dim sin2m As Double = Math.Sin(2.0 * Radians(m))
Dim Etime As Double = y * sin2l0 - 2.0 * e * sinm + 4.0 * e * y * sinm * cos2l0 - 0.5 * y * y * sin4l0 - 1.25 * e * e * sin2m
Return Degrees(Etime) * 4.0
' in minutes of time
End Function
'***********************************************************************/
'* Name: SunriseHourAngle
'* Type: Function
'* Purpose: calculate the hour angle of the Sun at sunrise for the
'* latitude
'* Arguments:
'* lat : latitude of observer in degrees
'* solarDec : declination angle of Sun in degrees
'* Return value:
'* hour angle of sunrise in radians
'***********************************************************************/
Public Function SunriseHourAngle(lat As Double, solarDec As Double) As Double
Dim latRad As Double = Radians(lat)
Dim sdRad As Double = Radians(solarDec)
Dim HAarg As Double = (Math.Cos(Radians(90.833)) / (Math.Cos(latRad) * Math.Cos(sdRad)) - Math.Tan(latRad) * Math.Tan(sdRad))
Dim HA As Double = (Math.Acos(Math.Cos(Radians(90.833)) / (Math.Cos(latRad) * Math.Cos(sdRad)) - Math.Tan(latRad) * Math.Tan(sdRad)))
Return HA
' in radians
End Function
'***********************************************************************/
'* Name: SunsetHourAngle
'* Type: Function
'* Purpose: calculate the hour angle of the Sun at sunset for the
'* latitude
'* Arguments:
'* lat : latitude of observer in degrees
'* solarDec : declination angle of Sun in degrees
'* Return value:
'* hour angle of sunset in radians
'***********************************************************************/
Public Function SunsetHourAngle(lat As Double, solarDec As Double) As Double
Dim latRad As Double = Radians(lat)
Dim sdRad As Double = Radians(solarDec)
Dim HAarg As Double = (Math.Cos(Radians(90.833)) / (Math.Cos(latRad) * Math.Cos(sdRad)) - Math.Tan(latRad) * Math.Tan(sdRad))
Dim HA As Double = (Math.Acos(Math.Cos(Radians(90.833)) / (Math.Cos(latRad) * Math.Cos(sdRad)) - Math.Tan(latRad) * Math.Tan(sdRad)))
Return -HA
' in radians
End Function
'***********************************************************************/
'* Name: SunRiseUTC
'* Type: Function
'* Purpose: calculate the Universal Coordinated Time (UTC) of sunrise
'* for the given day at the given location on earth
'* Arguments:
'* julian : julian day
'* latitude : latitude of observer in degrees
'* longitude : longitude of observer in degrees
'* Return value:
'* time in minutes from zero Z
'***********************************************************************/
'Public Function SunRiseUTC(julian As Double, latitude As Double, longitude As Double) As Double
' Dim t As Double = JulianCenturies(julian)
' ' *** Find the time of solar noon at the location, and use
' ' that declination. This is better than start of the
' ' Julian day
' Dim noonmin As Double = SolarNoonUTC(t, longitude)
' Dim tnoon As Double = JulianCenturies(julian + noonmin / 1440.0)
' ' *** First pass to approximate sunrise (using solar noon)
' Dim eqTime As Double = TrueSolarToMeanSolar(tnoon)
' Dim solarDec As Double = SunDeclination(tnoon)
' Dim hourAngle As Double = SunriseHourAngle(latitude, solarDec)
' Dim delta As Double = longitude - Degrees(hourAngle)
' Dim timeDiff As Double = 4 * delta
' ' in minutes of time
' Dim timeUTC As Double = 720 + timeDiff - eqTime
' ' in minutes
' ' alert("eqTime = " + eqTime + "\nsolarDec = " + solarDec + "\ntimeUTC = " + timeUTC);
' ' *** Second pass includes fractional julianay in gamma calc
' Dim newt As Double = JulianCenturies(JulianDayFromJulianCentury(t) + timeUTC / 1440.0)
' eqTime = TrueSolarToMeanSolar(newt)
' solarDec = SunDeclination(newt)
' hourAngle = SunriseHourAngle(latitude, solarDec)
' delta = longitude - Degrees(hourAngle)
' timeDiff = 4 * delta
' timeUTC = 720 + timeDiff - eqTime
' ' in minutes
' ' alert("eqTime = " + eqTime + "\nsolarDec = " + solarDec + "\ntimeUTC = " + timeUTC);
' Return timeUTC
'End Function
'***********************************************************************/
'* Name: SolarNoonUTC
'* Type: Function
'* Purpose: calculate the Universal Coordinated Time (UTC) of solar
'* noon for the given day at the given location on earth
'* Arguments:
'* t : number of Julian centuries since J2000.0
'* longitude : longitude of observer in degrees
'* Return value:
'* time in minutes from zero Z
'***********************************************************************/
Public Function SolarNoonUTC(t As Double, longitude As Double) As Double
' First pass uses approximate solar noon to calculate eqtime
Dim tnoon As Double = JulianCenturies(JulianDayFromJulianCentury(t) + longitude / 360.0)
Dim eqTime As Double = TrueSolarToMeanSolar(tnoon)
Dim solNoonUTC As Double = 720 + (longitude * 4) - eqTime
' min
Dim newt As Double = JulianCenturies(JulianDayFromJulianCentury(t) - 0.5 + solNoonUTC / 1440.0)
eqTime = TrueSolarToMeanSolar(newt)
' double solarNoonDec = SunDeclination(newt);
solNoonUTC = 720 + (longitude * 4) - eqTime
' min
Return solNoonUTC
End Function
'***********************************************************************/
'* Name: SunSetUTC
'* Type: Function
'* Purpose: calculate the Universal Coordinated Time (UTC) of sunset
'* for the given day at the given location on earth
'* Arguments:
'* julian : julian day
'* latitude : latitude of observer in degrees
'* longitude : longitude of observer in degrees
'* Return value:
'* time in minutes from zero Z
'***********************************************************************/
Public Function SunSetUTC(julian As Double, latitude As Double, longitude As Double) As Double
Dim t = JulianCenturies(julian)
Dim eqTime = TrueSolarToMeanSolar(t)
Dim solarDec = SunDeclination(t)
Dim hourAngle = SunriseHourAngle(latitude, solarDec)
hourAngle = -hourAngle
Dim delta = longitude + Degrees(hourAngle)
Dim timeUTC = 720 - (4.0 * delta) - eqTime
' in minutes
Return timeUTC
End Function
Public Function SunRiseUTC(julian As Double, latitude As Double, longitude As Double) As Double
Dim t = JulianCenturies(julian)
Dim eqTime = TrueSolarToMeanSolar(t)
Dim solarDec = SunDeclination(t)
Dim hourAngle = SunriseHourAngle(latitude, solarDec)
Dim delta = longitude + Degrees(hourAngle)
Dim timeUTC = 720 - (4.0 * delta) - eqTime
' in minutes
Return timeUTC
End Function
Public Function getTimeString(time As Double, timezone As Integer, julian As Double, dst As Boolean) As String
Dim timeLocal = time + (timezone * 60.0)
Dim riseT = JulianCenturies(julian + time / 1440.0)
timeLocal += (If((dst), 60.0, 0.0))
Return getTimeString(timeLocal)
End Function
Public Function getDateTime(time As Double, timezone As Integer, [date] As DateTime, dst As Boolean) As System.Nullable(Of DateTime)
Dim julian As Double = JulianDay([date])
Dim timeLocal = time + (timezone * 60.0)
Dim riseT = JulianCenturies(julian + time / 1440.0)
timeLocal += (If((dst), 60.0, 0.0))
Return getDateTime(timeLocal, [date])
End Function
Private Function getTimeString(minutes As Double) As String
Dim output As String = ""
If (minutes >= 0) AndAlso (minutes < 1440) Then
Dim floatHour = minutes / 60.0
Dim hour = Math.Floor(floatHour)
Dim floatMinute = 60.0 * (floatHour - Math.Floor(floatHour))
Dim minute = Math.Floor(floatMinute)
Dim floatSec = 60.0 * (floatMinute - Math.Floor(floatMinute))
Dim second = Math.Floor(floatSec + 0.5)
If second > 59 Then
second = 0
minute += 1
End If
If (second >= 30) Then
minute += 1
End If
If minute > 59 Then
minute = 0
hour += 1
End If
output = [String].Format("{0:00}:{1:00}", hour, minute)
Else
Return "error"
End If
Return output
End Function
Private Function getDateTime(minutes As Double, [date] As DateTime) As System.Nullable(Of DateTime)
Dim retVal As System.Nullable(Of DateTime) = Nothing
If (minutes >= 0) AndAlso (minutes < 1440) Then
Dim floatHour = minutes / 60.0
Dim hour = Math.Floor(floatHour)
Dim floatMinute = 60.0 * (floatHour - Math.Floor(floatHour))
Dim minute = Math.Floor(floatMinute)
Dim floatSec = 60.0 * (floatMinute - Math.Floor(floatMinute))
Dim second = Math.Floor(floatSec + 0.5)
If second > 59 Then
second = 0
minute += 1
End If
If (second >= 30) Then
minute += 1
End If
If minute > 59 Then
minute = 0
hour += 1
End If
Return New DateTime([date].Year, [date].Month, [date].Day, CInt(hour), CInt(minute), CInt(second))
Else
Return retVal
End If
End Function
End Module
この情報から始めます:
これを使用してRubyスクリプトはまだ作成中です。マルチパートのジュリアン日付を理解するのに問題があります。
明確なことの1つは、正確な太陽通過時間を求めなければならないということです。次に、緯度と太陽の赤緯に基づくsemi_diurnal_arc = acos(cos_omega)を減算して追加します。ああ!そして、必ず太陽の中心と地球の屈折を含めてください。この地球はまるで魔術師のようです。
私は簡単に作成しましたPythonそれを行うスクリプト: SunriseSunsetCalculator
まだクラスの中にラップしていませんが、他の人にとっては役立つかもしれません。
編集:オープンソースは素晴らしいです。基本的なスクリプトをコミットしているため、誰かがそれをモジュールにラップし、別のスクリプトがcliインターフェイスを追加しました。 mbideauとnfischerの貢献に感謝します!
太陽の周りの地球の月系の偏心軌道を可能にする時間の方程式を含む公式が必要です。 WGS84やNAD27などの適切なデータム点を含む座標を使用する必要があります。これらの時間を正しく取得するには、JULIANカレンダーを使用する必要があります。毎日使用するカレンダーではありません。瞬時に推測するのは簡単なことではありません。影の長さが高さに等しい場所で時間を過ごしたいのですが。これは、太陽が正午の前後に地平線から60度上昇するときに1日に2回発生します。また、私が理解している限り、恒星時を取得するには1年に1日だけ正確に追加する必要があるので、クロック周波数X 366.25/365.25を増やしたい場合は、民間時計の代わりに恒星時計を使用できますか??? 「MATHは、強力な誰かが宇宙を書いた言語です」
別の良いJS実装は suncalc です。
コード行の数は管理可能であるため、他の言語(C#)への移植は確かに可能です。
このnugetパッケージをUWPでテストしました。
https://www.nuget.org/packages/SolarCalculator/
ドキュメントは少し大ざっぱですが、ここにあります:
https://github.com/porrey/Solar-Calculator
これを使用して、日の出を取得できます
la =緯度。そして、lo =経度;お住まいの地域:
SolarTimes solarTimes = new SolarTimes(DateTime.Now, la, lo);
DateTime sr = solarTimes.Sunrise;
DateTime dt = Convert.ToDateTime(sr);
textblockb.Text = dt.ToString("h:mm:ss");
PM managerを使用してVisual Studioにインストールできます。
Install-Package SolarCalculator -Version 2.0.2
または、「NuGetパッケージの管理」Visual StudioライブラリでSolarCalculatorを検索します。
外部サービスが必要な場合は、この素敵で無料の日の出と日の入りの時間APIを使用できます。 http://sunrise-sunset.org/api
私はいくつかのプロジェクトでそれを使用しており、それは非常にうまく機能し、データは非常に正確であるようです。 http://api.sunrise-sunset.org/json に対してHTTP GETリクエストを実行するだけです。
使用できるパラメータ:
応答には、日の出と日の入り時間、および夕暮れ時間が含まれます。
はい、いくつか終了しました。
パターンのいくつかのリンク。
http://williams.best.vwh.net/sunrise_sunset_example.htm
http://www.codeproject.com/Articles/29306/C-Class-for-Calculating-Sunrise-and-Sunset-Times
https://Gist.github.com/cstrahan/767532
http://pointofint.blogspot.com/2014/06/sunrise-and-sunset-in-c.html
http://yaddb.blogspot.com/2013/01/how-to-calculate-sunrise-and-sunset.html
https://forums.asp.net/t/1810934.aspx?Sunrise+and+Sunset+timings+Calculation+
http://www.ip2location.com/tutorials/display-sunrise-sunset-time-using-csharp-and-mysql-database
http://en.pudn.com/downloads270/sourcecode/windows/csharp/detail1235934_en.html
http://regator.com/p/25716249/c_class_for_calculating_sunrise_and_sunset_times
http://forums.xkcd.com/viewtopic.php?t=102253
http://www.redrok.com/solar_position_algorithm.pdf
http://sidstation.loudet.org/sunazimuth-en.xhtml
https://sourceforge.net/directory/os:windows/?q=sunrise/set%20times
https://www.nuget.org/packages/SolarCalculator/
http://www.Grasshopper3d.com/forum/topics/solar-calculation-plugin
これはずっと前にPlanet Source Codeで作成したプロジェクトでしたが、幸い、そのサイトのデータが失われたため、他の場所に保存しました。
https://github.com/DouglasAllen/SunTimes.VSCS.Net
このGist plusを使用します
https://Gist.github.com/DouglasAllen/c682e4c412a0b9d8f536b014c1766f20
それを行うためのテクニックについて簡単に説明します。
最初に、あなたはあなたの場所のために真の太陽正午または通過を必要とします。
それはあなたのローカル経度を考慮に入れます。 15で除算するだけで時間に変換できます。
これは、ズールーゾーンの時刻または経度ゼロからの時間です。
それは12:00に始まりますPMまたは正午。
そしてあなたの時間は経度から計算されます。
今、難しい部分です。時間の方程式を計算する方法が必要です。
それは地球の傾きと太陽の周りの軌道によって引き起こされる時間差です。
これはあなたにアイデアを与えます... https://en.wikipedia.org/wiki/Equation_of_time
しかし、彼らははるかに簡単な式を持っています... https://en.wikipedia.org/wiki/Sunrise_equation
この男は、多くの人が行きかったり、買ったりする本をいくつか持っています。 :-D https://en.wikipedia.org/wiki/Jean_Meeus
平均太陽輸送の最初の計算を使用して、JDNを計算します... https://en.wikipedia.org/wiki/Julian_day
これは、ユリウス世紀の時間としてすべての角度式で使用されます https://en.wikipedia.org/wiki/Julian_year_(astronomy)
https://en.wikipedia.org/wiki/Epoch_(天文学)
これは基本的に、JDNからJ2000や2451545.0などのエポックを引いたものをすべて36525.0で割って、ユリウス世紀またはtをパラメーターとして使用するほとんどの式で使用されます。時々ジュリアン千年紀が使用されます。その場合、それは3652500.0です。
秘訣は、時間の方程式を解くのに役立つ角度の式を見つけることです。
次に、真の太陽の通過を取得し、半日を差し引くか、場所の日光の半日を追加します。あなたは答えとソフトウェアでそれらを見つけるでしょう。
何かを手に入れたら、それを時間やオンライン計算機の検索に対してチェックできます。
これで十分です。ライブラリはあちこちにありますが、独自に作成することはそれほど難しくありません。私はしましたが、それはRubyにあります。それは有用であると証明できるかもしれません... https://github.com/DouglasAllen/gem-equationoftime
幸運を!