Convert DateTime to Julian Date in C# (ToOADate Safe?)

前端 未结 6 1986
梦如初夏
梦如初夏 2020-11-27 18:34

I need to convert from a standard Gregorian date to a Julian day number.

I\'ve seen nothing documented in C# to do this directly,

6条回答
  •  夕颜
    夕颜 (楼主)
    2020-11-27 19:05

    My code for modified Julian Date uses the same algorithm but a different magic number on the end so that the resulting value matches the Modified Julian Date shown on Wikipedia. I have been using this same algorithm for at least 10 years as the key for daily time series (originally in Java).

    public static int IntegerDate(DateTime date)
        {
            int Month = date.Month;
            int Day = date.Day;
            int Year = date.Year;
    
            if (Month < 3)
            {
                Month = Month + 12;
                Year = Year - 1;
            }
            //modified Julian Date
            return Day + (153 * Month - 457) / 5 + 365 * Year + (Year / 4) - (Year / 100) + (Year / 400) - 678882;
        }
    

    The reverse calculation has more magic numbers for your amusement:

    public static DateTime FromDateInteger(int mjd)
        {
            long a = mjd + 2468570;
            long b = (long)((4 * a) / 146097);
            a = a - ((long)((146097 * b + 3) / 4));
            long c = (long)((4000 * (a + 1) / 1461001));
            a = a - (long)((1461 * c) / 4) + 31;
            long d = (long)((80 * a) / 2447);
            int Day = (int)(a - (long)((2447 * d) / 80));
            a = (long)(d / 11);
            int Month = (int)(d + 2 - 12 * a);
            int Year = (int)(100 * (b - 49) + c + a);
            return new DateTime(Year, Month, Day);
        }
    

提交回复
热议问题