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

前端 未结 6 1982
梦如初夏
梦如初夏 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 18:56

    The explanation by David Yaw is spot on, but calculation of the cumulative number of days of the year for the months prior to the given month is anti-intuitive. If you prefer an array of integers to make the algorithm more clear then this will do:

        /*
         * convert magic numbers created by:
         *    (153*month - 457)/5) 
         * into an explicit array of integers
         */
        int[] CumulativeDays = new int[]
        {
            -92   // Month = 0  (Should not be accessed by algorithm)
          , -61   // Month = 1  (Should not be accessed by algorithm)
          , -31   // Month = 2  (Should not be accessed by algorithm)
          ,   0   // Month = 3  (March)
          ,  31   // Month = 4  (April)
          ,  61   // Month = 5  (May)
          ,  92   // Month = 6  (June)
          , 122   // Month = 7  (July)
          , 153   // Month = 8  (August)
          , 184   // Month = 9  (September)
          , 214   // Month = 10 (October)
          , 245   // Month = 11 (November)
          , 275   // Month = 12 (December)
          , 306   // Month = 13 (January, next year)
          , 337   // Month = 14 (February, next year)
        };
    

    and the first thre lines of the calculation then become:

      int julianDay = day
                      + CumulativeDays[month]
                      + 365*year
                      + (year/4)
    

    The expression

    (153*month - 457)/5)
    

    though produces the exact same sequence same integers as the array above for values in the range: 3 to 14; inclusive and does so with no storage requirements. The lack of storage requirements is only virtue in calculating the cumulative number of days in such and obfuscated way.

提交回复
热议问题