Вместо ZonedDateTime с именованными зонами, имеющими (над-) национальные стандарты, такие как экономия времени, используйте OffsetDateTime.
OffsetDateTime utc = OffsetDateTime.parse("2031-04-25T18:30:00Z");
OffsetDateTime asia = utc.withOffsetSameInstant(ZoneOffset.ofHoursMinutes(5, 30));
Разбор по умолчанию для формата ISO.
Z
означает ноль, UTC, +0: 00.
- Результирующее форматирование по умолчанию:
2031-04-26T00:00+05:30
.
После комментария Оле В.В.
Вышеуказанное особенно подвержено ошибкам, если используется летнее время, как в центральноевропейском времени с различными смещениями +1: 00 и +2: 00.
Instant raw = Instant.parse("2031-04-25T18:30:00Z");
ZonedDateTime zoned = raw.atZone(ZoneId.of("Asia/Calcutta"));
OffsetDateTime offset = OffsetDateTime.from(zoned);