๐Ÿคทโ€โ™€๏ธ ZoneId.of("UTC") != ZoneOffset.UTC

Seungyeon Choiยท2022๋…„ 5์›” 12์ผ
1

์ž๋ฐ”

๋ชฉ๋ก ๋ณด๊ธฐ
2/5

ZoneId.of("UTC") != ZoneOffset.UTC ์ผ๊นŒ?

        // 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์ธ์ง€ ์•Œ์•„๋ณด์ž!

ZoneId vs ZoneOffset

ํ‘œ์ค€ ๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด์ž.

ZoneId๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ด๋‹ค.

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 ํƒ€์ž…์ด ์žˆ๋‹ค.

ZoneOffset์€ ZoneId๋ฅผ ์ƒ์†ํ•œ ๊ตฌํ˜„์ฒด์ด๋‹ค.

A time-zone offset is the amount of time that a time-zone differs from Greenwich/UTC

๋ง ๊ทธ๋Œ€๋กœ ์‹œ์ฐจ์ด๋‹ค.
ํŠน์ • ํƒ€์ž„์กด์ด UTC๋กœ ๋ถ€ํ„ฐ ์–ผ๋งˆ๋‚˜ ์ฐจ์ด๊ฐ€ ๋‚˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๋˜๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋กœ๋Š” ZoneRegion์ด ์žˆ๋‹ค.

ZoneId์˜ ๋‘ ๋ฒˆ์งธ ์„ค๋ช…์ด ๋ฐ”๋กœ ์ด ๊ตฌํ˜„์ฒด์ด๋‹ค.

ZoneId.of("UTC") != ZoneOffset.UTC ์ด๋‹ค

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์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š”๊ฒŒ ๋” ๋งž์ง€์•Š์„๊นŒ? ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

profile
์บ˜๋ฆฐ๋” ๋งŒ๋“œ๋Š” ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹น

0๊ฐœ์˜ ๋Œ“๊ธ€