Ejemplo n.º 1
0
        static void TestDate(DateTime date)
        {
            warpup--;

            // NOTE: benchmark meaningless, first algorithm will have x3 time
            if (warpup < 0)
            {
                sw1.Start();
            }
            var jd1 = ComputeJulianDayNREL(date); // has strange condition for gregorian date < year 1582

            if (warpup < 0)
            {
                sw1.Stop();
            }

            if (warpup < 0)
            {
                sw2.Start();
            }
            var jd2 = ComputeJulianDayInt2(date);

            if (warpup < 0)
            {
                sw2.Stop();
            }

            if (warpup < 0)
            {
                sw3.Start();
            }
            var jd3 = ComputeJulianDayMeeus(date);

            if (warpup < 0)
            {
                sw3.Stop();
            }

            if (warpup < 0)
            {
                sw4.Start();
            }
            var jd4 = ComputeJulianDayInt(date);

            if (warpup < 0)
            {
                sw4.Stop();
            }

            // NOTE: there would be any internal void GetDatePart(out int year, out int month, out int day) hidden in the .net framework
            if (warpup < 0)
            {
                sw0.Start();
            }
            var year  = date.Year;
            var month = date.Month;
            var day   = date.Day;

            if (warpup < 0)
            {
                sw0.Stop();
            }

            if (warpup < 0)
            {
                sw5.Start();
            }
            var jd5 = (double)ComputeJulianDay(year, month, day);

            if (warpup < 0)
            {
                sw5.Stop();
            }

            jd5 += date.TimeOfDay.TotalDays - 0.5;

            var jdAard = date.ComputeJulianDay();

            //Report.Line("Date={0} Julian Day NREL: {1} ALT:{2}", date, (int)jd1, (int)jd2);

            if (!jd1.ApproximateEquals(jd2, 1e-07) || !jd1.ApproximateEquals(jd3, 1e-07) || !jd1.ApproximateEquals(jd4, 1e-07) || !jd1.ApproximateEquals(jdAard, 1e-7))
            {
                Report.Line("Date={0} Julian Day NREL: {1} ALT:{2}", date, (int)jd1, (int)jd2);
                Report.Line("FAIL");
            }

            var gd  = ComputeGregorianDay(date);
            var gd1 = date.Day + date.TimeOfDay.TotalDays;

            var gdAard = DateTimeExtensions.GregorianDayOfMonthFromJulianDay(jd1);

            if (!gd.ApproximateEquals(gd1, 1e-5) || !gd.ApproximateEquals(gdAard, 1e-5))
            {
                Report.Line("Date={0} Julian Day: {1} Gregorian Day: {2} {3} {4}", date, jd1, gd, gd1, gdAard);
                Report.Line("FAIL");
            }


            var date2 = DateTimeExtensions.ComputeDateFromJulianDay(jd1);
            var dt    = date - date2;

            if ((int)dt.TotalSeconds != 0)
            {
                Report.Line("DateIn={0} Julian Day={1} DateOut={2}", date, jd1, date2);
                Report.Line("FAIL");
            }

            if (year > 1)
            {
                var date3 = DateTimeExtensions.ComputeDateFromJulianDay((int)jd1);
                var tmp   = new DateTime(year, month, day, 12, 0, 0); // 12h noon
                if (jd1.Frac() > 0.5)
                {
                    tmp = tmp.AddDays(-1);
                }
                var dt2 = tmp - date3;
                if ((int)dt2.TotalSeconds != 0)
                {
                    Report.Line("DateIn={0} Julian Day={1} DateOut={2}", tmp, jd1, date3);
                    Report.Line("FAIL");
                }
            }
        }