What will be on the top of this decorative calendar?
C (glibc), 327 319 286 bytes

#define C strftime(s
#define U(B,E)S[6]=E-1,C+B,99,"%A"+2*!E,S)
S[9],s[99];f(M,D){S[4]=112233107696&gt;&gt;3*M&amp;7;C,9,"%B",S);S[4]^=1;
C+3,9,"%B",S);M=161102&gt;&gt;(D+M*23/9-1-2*(M&gt;2))%7*3&amp;7;U(6,M);U(9,(M^1));
printf("%s/%s %d%d %s/%s\n",
s,s+3,D&gt;29?4:D%10&lt;6?8:3,D&gt;29?8:1070160091&gt;&gt;D%10*3&amp;7,s+6,s+9);}


(Some line breaks added for clarity)

f takes a month (1–12) and a day (1–31). Prints to stdout. Try it online!

Test cases:

2019-01-29: July/August 37 Thursday/Wednesday
2019-07-11: May/June 83 Saturday/Friday
2019-10-27: January/February 36 Friday/Saturday
2019-05-01: March/April 83 Monday/Tuesday
2019-08-24: February/January 85 /Sunday


Ungolfed

#include &lt;stdio.h&gt;
#include &lt;time.h&gt;
void f(int M, int D) {
    int month_cube[] = {6,3,0,5,2,7,4,1,4,0,5,1};
    int day_cube[] = {3,3,3,4,5,2,2,6,7,7};
    int week_cube[] = {6,1,5,2,7,4,0}; /* 1=Sun, 7=Sat, 0=none */
    int D1 = D/10, D2 = D%10;
    char s[4][99] = {{0}};
    struct tm t;

    t.tm_mon = month_cube[M-1];
    strftime(s[0], 99, "%B", &amp;t);
    t.tm_mon = month_cube[M-1]^1;
    strftime(s[1], 99, "%B", &amp;t);

    if (D1 &gt;= 3) { /* D = 30, 31 */
        D1 = 4, D2 = 8;
    } else {
        if (D2 &lt;= 5) {
            D1 = 8; /* 012[69]78: 012 -&gt; 8 */
        } else {
            D1 = 3; /* 012345: 012 -&gt; 3 */
        }
        D2 = day_cube[D2];
    }

    int W = (D + M*23/9 - 1 - 2*(M&gt;2)) % 7; /* day of week */
    if (week_cube[W]) {
        t.tm_wday = week_cube[W] - 1;
        strftime(s[2], 99, "%A", &amp;t);
    }
    if (week_cube[W]^1) {
        t.tm_wday = (week_cube[W]^1) - 1;
        strftime(s[3], 99, "%A", &amp;t);
    }

    printf("%s/%s %d%d %s/%s\n", s[0], s[1], D1, D2, s[2], s[3]);
}


Digit cubes

These are the possibilities for the digits:

Cube 1:
0 1 2 3 4 5
3 3 3 4 5 2
5

Cube 2:
0 1 2        6 7 8 9
8 8 8        2 6 7 7
6                2
9


The following mapping seems like the best choice for golfing:

   01 02 03 04 05 06 07 08 09
   83 83 84 85 82 32 36 37 37

10 11 12 13 14 15 16 17 18 19
83 83 83 84 85 82 32 36 37 37

20 21 22 23 24 25 26 27 28 29
83 83 83 84 85 82 32 36 37 37

30 31
48 48


Cheats

strftime is meant to be called with a struct tm as input. Instead, I declare int S[9] and use S[4] as tm_mon and S[6] as tm_wday. This works if the C library uses the same list of struct members as the ISO standard.

s[99] is used to store various strings from strftime, but making it an int array saves a few bytes in indexing.