Agreed. I think this is where Java’s latest date/time libraries shine (heavily based on Joda time lib).
It makes a solid distinction between Dates, times, instants, and zone dates/times.
And Instant is a moment in time. Exposed as a UTC time stamp.
Birthdays etc are best expressed as LocalDates. There’s also LocalDateTime for zone-agnostic features.
If I were writing software like you describe I’d want an explicitly zone-agnostic date(time) to represent it.