Date to Day of the week algorithm?

前端 未结 3 1532
轻奢々
轻奢々 2020-12-20 12:35

What is the algorithm that, given a day, month and year, returns a day of the week?

相关标签:
3条回答
  • 2020-12-20 12:49

    This can be done using the std::mktime and std::localtime functions. These functions are not just POSIX, they are mandated by the C++ Standard (C++03 §20.5).

    #include <ctime>
    
    std::tm time_in = { 0, 0, 0, // second, minute, hour
            4, 9, 1984 - 1900 }; // 1-based day, 0-based month, year since 1900
    
    std::time_t time_temp = std::mktime( & time_in );
    
    // the return value from localtime is a static global - do not call
    // this function from more than one thread!
    std::tm const *time_out = std::localtime( & time_temp );
    
    std::cout << "I was born on (Sunday = 0) D.O.W. " << time_out->tm_wday << '\n';
    
    0 讨论(0)
  • 2020-12-20 12:52

    One of the easiest algorithm for this is Tomohiko Sakamoto Algorithm:

    static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
    y -= m < 3;
    return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
    }
    

    Check this out: https://iq.opengenus.org/tomohiko-sakamoto-algorithm/

    I found Wang's method also interesting

    w = (d - d^(m) + y^ - y* + [y^/4 - y*/2] - 2( c mod 4)) mod 7
    

    http://rmm.ludus-opuscula.org/PDF_Files/Wang_Day_5_8(3_2015)_high.pdf This pdf is really helpful too.

    Thanks!

    0 讨论(0)
  • 2020-12-20 13:12

    You need a starting point. Today is fine. Hard-code it.

    Then, you need to represent the number of days in a month. This is 31, 28, 31, 30, 31, 30, ... . So you can start adding and subtracting 365 % 7 to the day of the week for each year, and (sum of days in difference of month) % 7 again. And so on.

    The caveat: Leap years occur on every 4th year, but not every 100th, unless that year is also a multiple of 400.

    0 讨论(0)
提交回复
热议问题