Python 3.8, 118 114 113 112 bytes
New version
i=input();t=[-1]*59+[59];h=[0]*24+[-23];a=int(i[:2]);b=int(i[3:]);print(f'{a+h[a+int(t[b]/30)]:02}:{b-t[b]:02}')
Old version:
i=input();t=(1,0)*59+(-59,1);h=[0]*24+[-23];a=int(i[:2]);b=int(i[3:]);print(f'{a+h[a+t[b*2+1]]:02}:{b+t[b*2]:02}')
Older version:
i=input();t=[(1,0)]*59+[(-59,1)];h=[0]*23+[-24];a=int(i[:2]);b=int(i[3:]);print(f'{a+h[a]+t[b][1]:02}:{b+t[b][0]:02}')
Try it here!
Cleaner version
i=input()
t=[1]*59+[-59]
h=[0]*24+[-23]
a=int(i[:2])
b=int(i[3:])
print(f'{a+h[a+int(t[b]/-30)]:02}:{b+t[b]:02}')
A somewhat dumb but interesting approach I tried, I am pretty sure I can probably shorten this somewhere by 15-20~ Bytes, I will have to check it again later. The method uses two lookup arrays to figure out what to do with the date. Its worse than the other answers, but I thought its interesting enough to leave in after golfing it a bit. I am not really good at this yet haha.
Some thoughts that would be interesting to discuss, I see a few places where I can see an improvement being possible, but not sure how:
In the part (a=int(i[:2]);b=int(i[3:]);
this saves a number of bytes since I use a and b alot, but its still a very... ugly solution for the lack of a better word, I looked into a,b=map(int,i.split(":"))
which looks neater but unfortunately has the exact same size. I am still looking for a better solution here though.
I really hate how the lists/tuples are initialized, must be a better way..
Edit: I legitimately have no idea how I came up with this madness, but some weird maths helped me remove an extra byte, somehow haha...
I am certain I can push this further later..
Dang, just as I posted this I thought of a simple change with the signs that did save me another byte.