// given
ZonedDateTime now = ZonedDateTime.now();
ZoneId zoneId = ZoneId.of("UTC");
ZoneOffset offset = ZoneOffset.UTC;
// when
ZonedDateTime fromZoneId = now.withZoneSameInstant(zoneId);
ZonedDateTime fromZoneOffset = now.withZoneSameInstant(offset);
// then
assertTrue(fromZoneId.equals(fromZoneOffset), "์ฐธ์ผ๊น? ๊ฑฐ์ง์ผ๊น?๐ฏ");
UTC ๊ฐ ์ฃผ๋ ๋๋์ ์ธ ๋๋์ ๋ณ ์๊ฐ์์ด ๋น์ฐํ ์ฐธ์ธ ์ค ์์๋ค.
๊ทธ๋ ์ง๋ง..
๊ฒฐ๊ณผ๋..
์์ํ๋ฏ์ด..

๊ฑฐ์ง์ด๋ค.
์ง๊ธ๋ถํฐ ์ equals()์ ๊ฒฐ๊ณผ๊ฐ false์ธ์ง ์์๋ณด์!
ํ์ค ๋ฌธ์๋ฅผ ์ดํด๋ณด์.
A ZoneId is used to identify the rules used to convert between an Instant and a LocalDateTime. There are two distinct types of ID:
- Fixed offsets - a fully resolved offset from UTC/Greenwich, that uses the same offset for all local date-times
- Geographical regions - an area where a specific set of rules for finding the offset from UTC/Greenwich apply
Instant์ LocalDateTime ์ฌ์ด์ ๋ณํ ์ ๊ท์น์ด ๋๋ค.
์ด ๊ท์น์ Fixed offsets ์ Geographical regions ํ์
์ด ์๋ค.
A time-zone offset is the amount of time that a time-zone differs from Greenwich/UTC
๋ง ๊ทธ๋๋ก ์์ฐจ์ด๋ค.
ํน์ ํ์์กด์ด UTC๋ก ๋ถํฐ ์ผ๋ง๋ ์ฐจ์ด๊ฐ ๋๋์ง๋ฅผ ๋ํ๋ธ๋ค.
ZoneId์ ๋ ๋ฒ์งธ ์ค๋ช ์ด ๋ฐ๋ก ์ด ๊ตฌํ์ฒด์ด๋ค.
ZoneId.of() ํจ์๋ ์ธ์์ธ ๋ฌธ์์ด์ ํ์ฑํด์, ํ์ฑ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ ๊ฐ์ง ํ์ ์ ZoneId๋ฅผ ๋ง๋ ๋ค.
ZoneId.of("UTC")๋ ์๋ ํจ์๋ฅผ ํตํด ZoneRegion ํ์
์ผ๋ก ๋ฆฌํด๋๋ค.

์ฆ UTC๋ผ๋ ๋ฌธ์์ด๋ง ๊ฐ์ ๋ฟ,
ZoneId.of("UTC") ๋ ZoneRegion ํ์
์ด๊ณ ZoneOffset.UTC์ ZoneOffset ํ์
์ด๋ค.
์ด ๋ ZoneId๋ฅผ ๊ฐ์ง๊ณ ZonedDateTime ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ณด์.
ZonedDateTime fromZoneRegion = now.withZoneSameInstant(ZoneId.of("UTC"));
// 2022-05-12T16:02:48.758Z[UTC]
ZonedDateTime fromZoneOffset = now.withZoneSameInstant(ZoneOffset.UTC);
// 2022-05-12T16:02:48.758Z
// ์์ฐจ ์ ๋ณด๋ก ํ์์กด์ ์ ์ ์๋ค.

๋ฐ๋ผ์ ๋ ๊ฐ์ zone ๊ฐ์ด ๋ค๋ฅด๋ฏ๋ก, equals ๋น๊ต์์ ์ฐธ์ด ๋ ์ ์๋ค.
์ฒ์์ ํ๊น๋ณด๊ณ ๋์ด ๊ฐ๋ค๊ณ ์๊ฐํ๊ฑด ์ฐฉ๊ฐ์ด์์ง๋ง...
ZoneId.of("UTC")๊ฐ ZoneRegion ํ์
์ด ์๋๋ผ ZoneOffset์ผ๋ก ๋ง๋ค์ด์ง๋๊ฒ ๋ ๋ง์ง์์๊น? ํ๋ ์๊ฐ์ด ๋ค์๋ค.