The standard date utility doesn't support a -d option. There are a few implementations that do, but sometimes for completely different things.
Several of them (including some BSDs now even though they have their own different syntax for that) have a -d to specify an input date as opposed to take the system clock, following GNU date's lead, but the input format(s) they recognise is different between them. Some of them allow specifying the input format in strptime() fashion (ast-open, busybox, toybox), others don't (GNU, NetBSD¹).
Among the date implementations that support -d to specify an input date, I know of only ast-open's (AT&T Software Technology from AT&T Research formerly known as Bell Labs where Unix was born) that supports ISO8601 durations. But ast-open is no longer maintained AFAIK.
However ksh93, which uses the same date manipulation library is still maintained, and you can use its printf builtin to do the equivalent of GNU date -d:
$ TZ=UTZ0 printf '%(%FT%TZ)T\n' '2024-12-01T00:00:00Z PT3D'
2024-12-04T00:00:00Z
Beware that its DST handling when it comes to date calculation is still quite buggy, though that doesn't apply for UTC dates.
To make it a function to be used in another Bourne-like shell:
iso_add_time() { # args: <duration> <datetime> [<datetime>...]
ksh93 -c '
duration=${1?}; shift
for date do
TZ=UTC0 printf "%(%FT%TZ)T\n" "$date $duration" || exit
done' ksh93 "$@"
}
¹ Though NetBSD's like other BSD's allow specifying the input format if using the BSD style way to specify the input date.
2024-12-04T05:00:00Zresult for your first command looks bogus. With-uand GNUdateI'd expect2024-12-04T00:00:00Z2024-12-01T00:00:00Z/P3D(noTand and period after the reference date separated with a/)?2024-12-01T00:00:00Z/P3Dmeans interval of times. The goal was to add time and duration and get time as the result. en.wikipedia.org/wiki/ISO_8601