static void Main(string[] args) { DateTime datevalue = DateTime.Now; DateTime dateC = new DateTime(2019, 04, 29); SolarInfo myInfo = ForDate(38.897079, -77.036605, datevalue, 0); Console.WriteLine("Fecha => " + myInfo.Date); Console.WriteLine("Declinación solar => " + myInfo.SolarDeclination); Console.WriteLine("Ecuación del tiempo => " + myInfo.EquationOfTime); Console.WriteLine("Orto => " + myInfo.Sunrise); Console.WriteLine("Ocaso => " + myInfo.Sunset); Console.WriteLine("Medio día solar => " + myInfo.Noon); }
/// <summary> /// Devuelve la información solar del día especificado, para una latitud y una langitud concreta. /// </summary> /// <param name="latitude">Latitud de la ubicación a calcular su info</param> /// <param name="longitude">Latitud de la ubicación a calcular su info</param> /// <param name="date">Día del que se necisita la información</param> /// <param name="UTC_GMT">Desfase horario teniendo en cuenta los horarios de verano e invierno</param> /// <returns></returns> public static SolarInfo ForDate(double latitude, double longitude, DateTime date, double UTC_GMT) { var info = new SolarInfo(); info.Date = date = date.Date; var year = date.Year; var month = date.Month; var day = date.Day; if (latitude >= -90 && latitude < -89) { //Todas las latitudes entre -89 y -90 se establecerán en -89 latitude = -89; } if (latitude <= 90 && latitude > 89) { //Todas las latitudes entre 89 y 90 se establecerán en 89 latitude = 89; } if (latitude < 0) { UTC_GMT = -UTC_GMT; } //Calcula la hora del amanecer var JD = calcJD(year, month, day); var doy = calcDayOfYear(month, day, isLeapYear(year)); var T = calcTimeJulianCent(JD); var solarDec = calcSunDeclination(T); var eqTime = calcEquationOfTime(T); // (en minutos) // Calcula el amanecer para esta fecha // si no se encuentra ningún amanecer, establece la bandera nosunrise var nosunrise = false; var riseTimeGMT = calcSunriseUTC(JD, latitude, longitude, UTC_GMT); nosunrise = !isNumber(riseTimeGMT); // Calcula la puesta de sol para esta fecha // si no se encuentra ninguna puesta de sol, establece la bandera nosunset var nosunset = false; var setTimeGMT = calcSunsetUTC(JD, latitude, longitude, UTC_GMT); if (!isNumber(setTimeGMT)) { nosunset = true; } if (!nosunrise) // Se encontró el amanecer { info.Sunrise = date.Date.AddMinutes(riseTimeGMT); } if (!nosunset) // Se encontró la puesta de sol { info.Sunset = date.Date.AddMinutes(setTimeGMT); } // Calcula el mediodía solar para esta fecha. var solNoonGMT = calcSolNoonUTC(T, longitude, UTC_GMT); if (!(nosunset || nosunrise)) { info.Noon = TimeSpan.FromMinutes(solNoonGMT); } var tsnoon = calcTimeJulianCent(calcJDFromJulianCent(T) - 0.5 + solNoonGMT / 1440.0); eqTime = calcEquationOfTime(tsnoon); solarDec = calcSunDeclination(tsnoon); info.EquationOfTime = TimeSpan.FromMinutes(eqTime); info.SolarDeclination = solarDec; // Reporta casos especiales de no amanecer. if (nosunrise) { // Si es hemisferio norte y primavera o verano, o // Si es hemisferio sur y otoño o invierno, usa // amanecer anterior y siguiente atardecer if (latitude > 66.4 && doy > 79 && doy < 267 || latitude < -66.4 && (doy < 83 || doy > 263)) { var newjd = findRecentSunrise(JD, latitude, longitude, UTC_GMT); var newtime = calcSunriseUTC(newjd, latitude, longitude, UTC_GMT); if (newtime > 1440) { newtime -= 1440; newjd += 1.0; } if (newtime < 0) { newtime += 1440; newjd -= 1.0; } info.Sunrise = ConvertToDate(newtime, newjd); } // Si es hemisferio norte y otoño o invierno, o // Si es hemisferio sur y primavera o verano, usa // el próximo amanecer y el atardecer anterior else if (latitude > 66.4 && (doy < 83 || doy > 263) || latitude < -66.4 && doy > 79 && doy < 267) { var newjd = findNextSunrise(JD, latitude, longitude, UTC_GMT); var newtime = calcSunriseUTC(newjd, latitude, longitude, UTC_GMT); if (newtime > 1440) { newtime -= 1440; newjd += 1.0; } if (newtime < 0) { newtime += 1440; newjd -= 1.0; } info.Sunrise = ConvertToDate(newtime, newjd); } else { Debug.Fail("No se puede encontrar el amanecer!"); } } if (nosunset) { // Si es hemisferio norte y primavera o verano, o // Si es hemisferio sur y otoño o invierno, use // amanecer anterior y siguiente atardecer if (latitude > 66.4 && doy > 79 && doy < 267 || latitude < -66.4 && (doy < 83 || doy > 263)) { var newjd = findNextSunset(JD, latitude, longitude, UTC_GMT); var newtime = calcSunsetUTC(newjd, latitude, longitude, UTC_GMT); if (newtime > 1440) { newtime -= 1440; newjd += 1.0; } if (newtime < 0) { newtime += 1440; newjd -= 1.0; } info.Sunset = ConvertToDate(newtime, newjd); } // Si es hemisferio norte y otoño o invierno, o // Si es hemisferio sur y primavera o verano, use // el próximo amanecer y el último atardecer else if (latitude > 66.4 && (doy < 83 || doy > 263) || latitude < -66.4 && doy > 79 && doy < 267) { var newjd = findRecentSunset(JD, latitude, longitude, UTC_GMT); var newtime = calcSunsetUTC(newjd, latitude, longitude, UTC_GMT); if (newtime > 1440) { newtime -= 1440; newjd += 1.0; } if (newtime < 0) { newtime += 1440; newjd -= 1.0; } info.Sunset = ConvertToDate(newtime, newjd); } else { Debug.Fail("No se puede encontrar la puesta del sol!"); } } return(info); }