سؤال

هل هناك طريقة في C# لحساب إعطاء خطوط الطول والعرض عندما تكون الشمس سيتم تعيين ارتفاع معين في اليوم ؟

هل كانت مفيدة؟

المحلول

وحسابات جافا سكريبت <ديل> هنا . الآن تحتاج فقط إلى الميناء.


وتحرير: الحسابات هي في التعليمات البرمجية المصدر من هذه الصفحة الآن .


وتحرير: هنا هو وجود صلة مباشرة إلى مصدر الشفرة. لا حاجة للذهاب الصيد من خلال أتش تي أم أل.

نصائح أخرى

وأنا أعلم أن هذا المنصب هو القديمة، ولكن في حال كان هناك من لا يزال يبحث ...

CoordinateSharp متاح كحزمة Nuget. انها ثيس دعم بذاتها التي يمكن التعامل مع الشمس وكذلك الأوقات القمر.

Celestial cel = Celestial.CalculateCelestialTimes(85.57682, -70.75678, new DateTime(2017,8,21));
Console.WriteLine(cel.SunRise.Value.ToString());

ملاحظة:

ويفترض DateTimes هي دائما في UTC.

وأخيرا، قد تحتاج إلى مرجع السماوية الكائنات الشمس / القمر .Condition إذا باطلة عوائد التاريخ. يحدث هذا عندما تكون الشمس أعلى / أسفل كل يوم.

وتحرير 2019/01/09

لقد تغيرت المكتبة بشكل كبير منذ هذا المنصب. ويمكن الآن التعامل مع الأوقات المحلية أيضا.

واعتدت NAA جافا سكريبت وج # لإنشاء هذه المكتبة في C #.

الشروق والغروب في C #

واختبرته ضد هذين الموقعين، وهذا يظهر الوقت بالضبط مثل المواقع القيام به.

http://www.timeanddate.com/sun/usa/seattle

http://www.esrl.noaa.gov/gmd/grad/solcalc/

وهذا API يبدو أن العمل بالنسبة لي:

http://sunrise-sunset.org/api

وكان الجواب المقبولة لهذا التنفيذ جافا سكريبت، الذي لم يكن مريحا طلبي لأنني بحاجة إلى القيام حساب في C #.

ولقد استعملت هذا C # رمز: HTTP: //wiki.crowe. co.nz/Calculate٪20Sunrise٪2fSunset.ashx ، التي أشرت التحقق من صحة ضد الأوقات شروق / غروب الشمس هنا: <لأ href = "http://www.timeanddate.com/astronomy/" يختلط = "noreferrer "> http://www.timeanddate.com/astronomy/ .

إذا كنت ثواني وإيابا إلى أقرب دقيقة، مباراة شروق الشمس وغروبها أضعاف C # تنفيذ والقيم المقابلة المعروضة على timeanddate.com، بما في ذلك حالات الصيفي. رمز قليلا الساحق على الرغم من (إلا إذا كنت ترغب البيانات مرحلة القمر أيضا)، ولذا فإنني سوف يتم إعادة بيع ديون أن تفعل على وجه التحديد ما أحتاج الآن أعداد صحيحة.

والبدء مع هذه المعلومات:

Sunrise_equation

وأنا باستخدام هذا رايت السيناريو روبي التي لا تزال في طور التكوين. أواجه مشكلة في فهم تواريخ جوليان متعددة الأجزاء.

وشيء واحد واضح هو أن عليك أن تذهب لعبور الوقت المحدد الشمسية. ثم طرح وإضافة semi_diurnal_arc = ACOS (cos_omega) التي يوجد مقرها على خط العرض والانحراف الشمسية. يا! ومما لا شك فيه لتشمل الطاقة الشمسية مركز والانكسار الأرض. يبدو أن هذه الأرض هي تماما على الساحر.

وVB.Net نسخة من الجواب dotsa، والتي يمكن أيضا تحديد مناطق زمنية تلقائيا.

والإخراج (التحقق من خلال مشاهدة غروب الشمس هذا المساء):

و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

ولقد قدم بيثون النصي سريعة للقيام بذلك: SunriseSunsetCalculator

وأنا لم ألفه داخل الطبقة ولكن قد يكون من المفيد للآخرين.


وتحرير: المصدر المفتوح رائع، منذ ارتكاب السيناريو الأساسي، شخص ملفوفة في وحدة واحدة أخرى بإضافة واجهة المبادرة القطرية! بفضل mbideau وnfischer على مساهماتهم!

وأنت بحاجة إلى صيغة تتضمن معادلة الوقت للسماح للمدار غريب الأطوار من نظام قمر الأرض حول الشمس. تحتاج إلى استخدام الإحداثيات مع نقاط مسند المناسبة مثل WGS84 أو NAD27 أو شيء من هذا القبيل. تحتاج إلى استخدام التقويم اليولياني وليس واحدة نستخدمها بشكل يومي لget5 هذه الأوقات الحق. ذلك ليس بالأمر السهل تخمين في غضون الثانية من الوقت. معرف مثل لديهم الوقت في بلدي الموقع حيث طول الظل يساوي أيا كان الارتفاع. هذا يجب أن يحدث مرتين في اليوم الواحد عندما ارتقى الشمس 60 درجة فوق الأفق قبل وبعد الظهيرة. أيضا، بقدر ما أفهم، تحتاج فقط إلى إضافة بالضبط يوم واحد في السنة للحصول على وقت فلكي حتى إذا كنت ترغب زيادة وتيرة الخاص على مدار الساعة X 366.25 / 365.25 قد يكون لديك الآن على مدار الساعة فلكية بدلا من ساعة المدنية ؟؟؟ "MATH هو اللغة التي شخص قوي وقد كتب الكون"

وتنفيذ آخر JS هو جيد suncalc .

وعدد خطوط متاحة يمكن التحكم فيها، لذلك ترقية إلى اللغات الأخرى (C #) هو ممكن بالتأكيد.

إذا كنت تفضل خدمة خارجي هل يمكن استخدام هذا لطيف مجانا شروق الشمس وغروبها مرة API: http://sunrise-sunset.org/api

لقد تم استخدامه لعدة مشاريع و أنه يعمل بشكل جيد جدا, يبدو أن البيانات تكون دقيقة جدا.فقط لا طلب HTTP GET إلى http://api.sunrise-sunset.org/json

تقبل المعلمات:

  • اللات:العرض في الدرجات العشرية.المطلوبة.
  • الغاز الطبيعي المسال:الطول في الدرجات العشرية.المطلوبة.
  • التاريخ:تاريخ في YYYY-MM-DD.كما يقبل البعض تنسيقات التاريخ وحتى النسبية تنسيقات التاريخ.إذا لم يكن موجودا ، تاريخ التخلف إلى التاريخ الحالي.اختياري.
  • رد:وظيفة رد الاتصال اسم JSONP الاستجابة.اختياري.
  • تنسيق:0 أو 1 (1 الافتراضية).قيم الوقت في الرد سوف يكون عن بعد 8601 ISO و day_length سيتم التعبير في ثوان.اختياري.

رد يشمل أوقات شروق وغروب الشمس وكذلك الشفق مرات.

ولقد اختبرت هذه الحزمة nuget في UWP.

https://www.nuget.org/packages/SolarCalculator/

والوثائق هي ناقصة بعض الشيء، وهنا هو:

https://github.com/porrey/Solar-Calculator

ويمكنك استخدام هذا للحصول على شروق الشمس، نظرا

ولا = خط العرض. والصغرى = الطول. لمنطقتك:

            SolarTimes solarTimes = new SolarTimes(DateTime.Now, la, lo);
            DateTime sr = solarTimes.Sunrise;
            DateTime dt = Convert.ToDateTime(sr);
            textblockb.Text = dt.ToString("h:mm:ss");

ويمكنك تثبيته في Visual Studio باستخدام PM مدير

Install-Package SolarCalculator -Version 2.0.2 

وأو عن طريق البحث عن SolarCalculator في "إدارة الحزم NuGet" مكتبة Visual Studio.

نعم الإقلاع قليلة.

بعض الروابط عن أنماط.

http://williams.best.vwh.net/sunrise_sunset_example.htm

http://www.codeproject.com/Articles/29306/C-Class-for-Calculating-Sunrise-and-Sunset-Times

https://social.msdn.microsoft.com/Forums/vstudio/en-US/a4fad4c3-6d18-41fc-82b7-1f3031349837/get-sunrise-and-sunset-time-based-on-latitude-and-longitude?forum=csharpgeneral

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

وكان هذا المشروع الذي فعلته من أجل كوكب البرمجية المصدر منذ فترة طويلة لكن لحسن الحظ أنقذت في مكان آخر لأن هذا الموقع البيانات المفقودة.

https://github.com/DouglasAllen/SunTimes.VSCS.Net

يستخدم هذا جوهر زائد

https://gist.github.com/DouglasAllen/c682e4c412a0b9d8f536b014c1766f20

الآن شرح هذه التقنية للقيام بذلك.

الأولى في أي يوم تحتاج صحيح الظهيرة الشمسية أو المرور للموقع الخاص بك.

أن يأخذ في الاعتبار الخاص بك المحلية الطول.فمن الممكن تحويلها إلى الوقت فقط عن طريق قسمة ذلك قبل 15.

هذا هو كم من الوقت كنت في وقت لاحق من الزولو الزمنية أو خط الطول صفر.

الذي يبدأ في 12:00 مساء أو الظهر.

و على وقتك تحسب من خط الطول.

الآن الجزء الصعب.كنت بحاجة إلى وسيلة لحساب المعادلة من الوقت.

هذا هو الفارق الزمني الناجم عن الأرض والميل المدار حول الشمس.

هذا وسوف تعطيك فكرة... 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_(علم الفلك)

https://en.wikipedia.org/wiki/Epoch_(علم الفلك)

انها في الأساس الخاص بك JDN ناقص الحقبة مثل J2000 أو 2451545.0 كل مقسوما 36525.0 تعطيك جوليان القرن أو t الذي يعتاد معظم الصيغة التي تم t كمعلمة.في بعض الأحيان جوليان آلاف السنين يستخدم.في هذه الحالة 3652500.0

الخدعة هو العثور على تلك الزاوية الصيغ التي تساعدك على حل المعادلة من الوقت.

ثم يمكنك الحصول على الخاص بك الحقيقي الشمسية والعبور طرح نصف يوم أو إضافة نصف يوم من أشعة الشمس على الموقع الخاص بك.ستجد تلك حولها في إجابات البرنامج.

مرة واحدة يمكنك الحصول على شيء ما يمكنك التحقق من ذلك ضد البحث عن الزمن أو الآلات الحاسبة على الانترنت.

آمل أن يكون هذا هو ما يكفي لتحصل على الذهاب.هناك مكتبات في كل مكان ولكن ليس من الصعب أن تجعل الخاصة بك.لم لكنه في روبي.يمكن أن تكون مفيدة....https://github.com/DouglasAllen/gem-equationoftime

حظا سعيدا!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top