# Python 3, <s>712</s> <s>652</s> <s>636</s> <s>567</s> <s>563</s> <s>552</s> 550 bytes

<!-- language-all: lang-python -->

At last, I found time to write an answer for this excellent question. It isn't very golfed yet (the month names list and the number of days list are particularly egregious in this case, and the fact that handling negative `D` requires a separate while loop) but at least it's an answer.

    def h(s,n):
     x=s[:-3].split(", ");x=[1]*(len(x)<3)+x;t="Deepwinter,Midwinter,The Claw of Winter,The Claw of the Sunsets,The Claw of the Storms,Greengrass,The Melting,The Time of Flowers,Summertide,Midsummer,Shieldmeet,Highsun,The Fading,Highharvestide,Leaffall,The Rotting,The Feast of the Moon,The Drawing Down".split(",");p,q,r=int(x[0])+n,t.index(x[1]),int(x[2]);d=[30,1,30,30]*2+[30,1,r%4<1,30]+[30,1,30]*2
     while p>d[q]or p<1:a=[-1,1][p<1];q=(q-a)%18;p+=a*d[q-(a<0)];r-=a*(q<1);d[10]=r%4<1
     return', '.join([str(p)]*(d[q]>2)+[t[q],str(r)])+" DR"

Ungolfed:

    def harptos(date, num):
        t = "Deepwinter,Midwinter,The Claw of Winter,The Claw of the Sunsets,The Claw of the Storms,Greengrass,The Melting,The Time of Flowers,Summertide,Midsummer,Shieldmeet,Highsun,The Fading,Highharvestide,Leaffall,The Rotting,The Feast of the Moon,The Drawing Down"
        t = t.split(",")        # split up the names of the months
        x = date[:-3]           # removes " DR"
        x = x.split(", ")
        if len(x) < 3:
            x = [1] + x         # if we have two items (holiday), append a "day of the month"
        p = int(x[0]) + num     # initialize the "date" by adding num to it
        q = t.index(x[1])
        r = int(x[2])
        d = [30,1,30,30]*2+[30,1,r%4<1,30]+[30,1,30]*2
                                # all the month lengths
        while p > d[q]:         # while the "date" > the number of days in the current month
            p -= d[q]           # decrement by number of days in current month
            q = (q+1)%18        # increment month
            r += q<1            # increment year if the incremented month == the first month
            d[10] = r%4 < 1     # leap year toggle
        while p < 1:            # while the "date" is negative
            q = (q-1)%18        # decrement month first
            p += d[q]           # add the number of days in the decremented month
            r -= q<1            # decrement year if the decremented month == the first month
            d[10] = r%4 < 1     # leap year toggle
        m = [t[q],str(r)]       # start the result array
        if d[q] > 2:
            m = [str(p)] + m    # if the month is NOT a holiday, add the day
        return ", ".join(m) + " DR"