Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        /// <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);
        }