Java 8 Date/Time API ํ™œ์šฉํ•˜๊ธฐ ๐Ÿ•ฐ๏ธ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - Java 8 Date/Time API ํ™œ์šฉํ•˜๊ธฐ ๐Ÿ•ฐ๏ธ

 

 

์•ˆ๋…•, ์ž๋ฐ” ๊ฐœ๋ฐœ์ž ์นœ๊ตฌ๋“ค! ์˜ค๋Š˜์€ ์šฐ๋ฆฌ๊ฐ€ ๋งค์ผ ์‚ฌ์šฉํ•˜๋Š” ๊ทธ ์‹œ๊ฐ„โฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณผ ๊ฑฐ์•ผ. ๊ทผ๋ฐ ์ด๋ฒˆ์—” ์ข€ ํŠน๋ณ„ํ•ด. ์šฐ๋ฆฌ์˜ ๋“ ๋“ ํ•œ ์นœ๊ตฌ Java 8์ด ์†Œ๊ฐœํ•œ ์ƒˆ๋กœ์šด Date/Time API์— ๋Œ€ํ•ด ๊นŠ์ด ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ๊ฑฐ๋“ ! ๐Ÿ˜Ž

ํ˜น์‹œ ์˜ˆ์ „์— ์ž๋ฐ”๋กœ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋‹ค๋ค„๋ณธ ์  ์žˆ์–ด? ๊ทธ๋•Œ ๋Š๋‚€ ๊ทธ ๋ถˆํŽธํ•จ, ๊ทธ ๋ณต์žกํ•จ... ๋‹ค๋“ค ๊ณต๊ฐํ•˜์ง€? ๐Ÿ˜… ํ•˜์ง€๋งŒ ์ด์ œ ๊ทธ๋Ÿฐ ๊ณ ๋ฏผ์€ bye bye~ Java 8์˜ Date/Time API์™€ ํ•จ๊ป˜๋ผ๋ฉด ์‹œ๊ฐ„ ๋‹ค๋ฃจ๊ธฐ๊ฐ€ ์ •๋ง ์‰ฌ์›Œ์ง„๋‹ค๊ณ !

์ž, ๊ทธ๋Ÿผ ์šฐ๋ฆฌ ํ•จ๊ป˜ ์‹œ๊ฐ„ ์—ฌํ–‰์„ ๋– ๋‚˜๋ณผ๊นŒ? ๐Ÿš€ Java 8 Date/Time API์˜ ์„ธ๊ณ„๋กœ ๊ณ ๊ณ ์”ฝ!

1. Java 8 ์ด์ „์˜ ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ์ฒ˜๋ฆฌ, ๋ฌด์—‡์ด ๋ฌธ์ œ์˜€์„๊นŒ? ๐Ÿค”

Java 8 ์ด์ „์—๋Š” ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋‹ค๋ฃจ๋Š” ๊ฒŒ ์ •๋ง... ์Œ, ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•ด์•ผ ํ• ๊นŒ? '์žฌ๋ฏธ์žˆ๋Š” ๋„์ „'์ด์—ˆ๋‹ค๊ณ  ํ• ๊นŒ? ๐Ÿ˜… ๊ทธ๋•Œ๋Š” ์ฃผ๋กœ java.util.Date์™€ java.util.Calendar ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ์ง€. ๊ทผ๋ฐ ์ด ๋…€์„๋“ค, ๋ฌธ์ œ๊ฐ€ ์ข€ ๋งŽ์•˜์–ด.

Java 8 ์ด์ „ ๋‚ ์งœ/์‹œ๊ฐ„ API์˜ ์ฃผ์š” ๋ฌธ์ œ์ ๋“ค:

  • ๋ถˆ๋ณ€์„ฑ(Immutability) ๋ถ€์กฑ ๐Ÿ˜ฑ
  • ํ—ท๊ฐˆ๋ฆฌ๋Š” ์›” ํ‘œํ˜„ (0๋ถ€ํ„ฐ ์‹œ์ž‘) ๐Ÿ™ƒ
  • ์“ฐ๋ ˆ๋“œ ์•ˆ์ „์„ฑ(Thread-safety) ๋ฌธ์ œ ๐Ÿ˜ฐ
  • ์‹œ๊ฐ„๋Œ€(TimeZone) ์ฒ˜๋ฆฌ์˜ ์–ด๋ ค์›€ ๐ŸŒ
  • ๋‚ ์งœ ์—ฐ์‚ฐ์˜ ๋ณต์žก์„ฑ ๐Ÿงฎ

์ด๋Ÿฐ ๋ฌธ์ œ์ ๋“ค ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋“ค์€ ๋งŽ์€ ๊ณ ๋ฏผ์„ ํ–ˆ์–ด. "์•„, ๋‚ ์งœ ๊ณ„์‚ฐ ์ข€ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์—†๋‚˜?", "์ด ์ฝ”๋“œ๊ฐ€ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ „ํ• ๊นŒ?", "๋‹ค๋ฅธ ์‹œ๊ฐ„๋Œ€ ์ฒ˜๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ํ•˜์ง€?" ์ด๋Ÿฐ ์งˆ๋ฌธ๋“ค์ด ๊ฐœ๋ฐœ์ž๋“ค์˜ ๋จธ๋ฆฌ๋ฅผ ์•„ํ”„๊ฒŒ ํ–ˆ์ง€.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ๋‹ฌ์„ ๋”ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์—ฐ์‚ฐ๋„ ๊ฝค ๋ณต์žกํ–ˆ์–ด. ๋ด๋ด:


Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.MONTH, 1);
Date oneMonthLater = calendar.getTime();

์Œ... ์ข€ ๋ณต์žกํ•˜์ง€ ์•Š์•„? ๐Ÿ˜… ๊ฒŒ๋‹ค๊ฐ€ ์ด ์ฝ”๋“œ, ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์•„. ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ด Calendar ์ธ์Šคํ„ด์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋ ค ๋“ค๋ฉด? ์Œ... ์ƒ๊ฐ๋งŒ ํ•ด๋„ ์•„์ฐ”ํ•˜๋„ค. ๐Ÿ˜ฑ

๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ๋ฐ”๋กœ ๋ถˆ๋ณ€์„ฑ(Immutability)์ด ์—†๋‹ค๋Š” ๊ฑฐ์•ผ. ์ด๊ฒŒ ๋ญ” ์†Œ๋ฆฌ๋ƒ๊ณ ? ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด์ค„๊ฒŒ. ์˜ˆ๋ฅผ ๋“ค์–ด, Date ๊ฐ์ฒด๋ฅผ ์—ฌ๊ธฐ์ €๊ธฐ ์ „๋‹ฌํ•˜๋‹ค ๋ณด๋ฉด ์–ด๋Š ์ˆœ๊ฐ„ ๊ทธ ๊ฐ’์ด ๋ฐ”๋€Œ์–ด ์žˆ์„ ์ˆ˜ ์žˆ์–ด. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ง€. ์ด๊ฑด ์ •๋ง ํฐ ๋ฌธ์ œ์•ผ. ํŠนํžˆ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ž‘์—…ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ๋”๋”์šฑ!

๋˜ ํ•˜๋‚˜, ์›”(Month)์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹๋„ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์„ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ–ˆ์–ด. Java์—์„œ๋Š” ์›”์„ 0๋ถ€ํ„ฐ 11๊นŒ์ง€์˜ ์ˆซ์ž๋กœ ํ‘œํ˜„ํ–ˆ๊ฑฐ๋“ . ๊ทธ๋ž˜์„œ 1์›”์€ 0, 12์›”์€ 11์ด ๋˜๋Š” ๊ฑฐ์ง€. ์ด๊ฑฐ ์ง„์งœ ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š์•„? ๐Ÿ˜ตโ€๐Ÿ’ซ


Calendar calendar = Calendar.getInstance();
calendar.set(2023, 0, 1);  // 2023๋…„ 1์›” 1์ผ์„ ์„ค์ •ํ•˜๋ ค๋ฉด ์ด๋ ‡๊ฒŒ!

์ด๋Ÿฐ ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์–ด. ๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ€๋…์„ฑ๋„ ๋–จ์–ด์ง€๊ณ , ์‹ค์ˆ˜ํ•˜๊ธฐ๋„ ์‰ฝ์ง€.

์‹œ๊ฐ„๋Œ€(TimeZone) ์ฒ˜๋ฆฌ๋„ ํฐ ๊ณจ์นซ๊ฑฐ๋ฆฌ ์ค‘ ํ•˜๋‚˜์˜€์–ด. ๊ธ€๋กœ๋ฒŒ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ, ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๊ฐ„๋Œ€๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒŒ ์ •๋ง ์ค‘์š”ํ•œ๋ฐ, ๊ธฐ์กด์˜ API๋กœ๋Š” ์ด๊ฑธ ์ฒ˜๋ฆฌํ•˜๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ค์› ๊ฑฐ๋“ .

๊ทธ๋ฆฌ๊ณ  ๋‚ ์งœ ์—ฐ์‚ฐ... ์•„, ์ด๊ฑด ์ •๋ง ๋ง๋„ ๋ชป ํ•ด. ๐Ÿ˜ซ ๋‹จ์ˆœํžˆ ๋ฉฐ์น  ํ›„์˜ ๋‚ ์งœ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ๋„ ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, 30์ผ ํ›„์˜ ๋‚ ์งœ๋ฅผ ๊ตฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํ•œ๋ฒˆ ๋ณผ๊นŒ?


Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DAY_OF_MONTH, 30);
Date thirtyDaysLater = calendar.getTime();

์Œ... ์ข€ ๋ณต์žกํ•˜์ง€? ๊ทธ๋ฆฌ๊ณ  ์ด ์ฝ”๋“œ, ์œค๋…„์ด๋‚˜ ์›”๋ง ๋‚ ์งœ ๋ณ€๊ฒฝ ๊ฐ™์€ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๊ทธ๊ฑด ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์•ผ.

์ด๋Ÿฐ ๋ฌธ์ œ๋“ค ๋•Œ๋ฌธ์— ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณค ํ–ˆ์–ด. ํŠนํžˆ Joda-Time์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ธ๊ธฐ ์žˆ์—ˆ์ง€. ์‹ค์ œ๋กœ Java 8์˜ ์ƒˆ๋กœ์šด Date/Time API๋Š” Joda-Time์—์„œ ๋งŽ์€ ์˜๊ฐ์„ ๋ฐ›์•˜๋Œ€.

์ž, ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ Java 8 ์ด์ „์˜ ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ์ฒ˜๋ฆฌ์˜ ์ฃผ์š” ๋ฌธ์ œ์ ๋“ค์ด์•ผ. ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋“ค์€ ๋งŽ์€ ๊ณ ๋ฏผ์„ ํ–ˆ๊ณ , ๊ฒฐ๊ตญ Java 8์—์„œ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด Date/Time API๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ ๋œ ๊ฑฐ์ง€.

๊ทธ๋Ÿผ ์ด์ œ ์šฐ๋ฆฌ์˜ ๊ตฌ์›์ž, Java 8 Date/Time API์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ฐจ๋ก€์•ผ! ์–ด๋–ค ๋†€๋ผ์šด ๊ธฐ๋Šฅ๋“ค์ด ์šฐ๋ฆฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์„๊นŒ? ๐Ÿ˜ƒ ๋‹ค์Œ ์„น์…˜์—์„œ ๊ณ„์† ์•Œ์•„๋ณด์ž!

2. Java 8 Date/Time API์˜ ๋“ฑ์žฅ! ๐ŸŽ‰

๋“œ๋””์–ด ์šฐ๋ฆฌ์˜ ์˜์›…์ด ๋“ฑ์žฅํ–ˆ์–ด! Java 8๊ณผ ํ•จ๊ป˜ ์†Œ๊ฐœ๋œ ์ƒˆ๋กœ์šด Date/Time API, ์ •์‹ ๋ช…์นญ์€ java.time ํŒจํ‚ค์ง€์•ผ. ์ด ๋…€์„, ์ •๋ง ๋Œ€๋‹จํ•ด. ์•ž์„œ ๋งํ–ˆ๋˜ ๋ชจ๋“  ๋ฌธ์ œ์ ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ณ , ๋” ์ง๊ด€์ ์ด๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ด์ฃผ๊ฑฐ๋“ . ๐Ÿ‘

์ž, ๊ทธ๋Ÿผ ์ด ์ƒˆ๋กœ์šด API์˜ ์ฃผ์š” ํŠน์ง•๋“ค์„ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณผ๊นŒ?

Java 8 Date/Time API์˜ ์ฃผ์š” ํŠน์ง•:

  • ๋ถˆ๋ณ€์„ฑ(Immutability) ๋ณด์žฅ ๐Ÿ›ก๏ธ
  • ๋ช…ํ™•ํ•œ ๊ตฌ๋ถ„: ์‚ฌ๋žŒ์„ ์œ„ํ•œ ์‹œ๊ฐ„ vs ๊ธฐ๊ณ„๋ฅผ ์œ„ํ•œ ์‹œ๊ฐ„ ๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘๐Ÿค–
  • ๋‹ค์–‘ํ•œ ๋‚ ์งœ/์‹œ๊ฐ„ ๊ด€๋ จ ํด๋ž˜์Šค ์ œ๊ณต ๐Ÿ“š
  • ๊ฐ•๋ ฅํ•œ ํฌ๋งคํŒ… ๊ธฐ๋Šฅ ๐ŸŽจ
  • ์‹œ๊ฐ„๋Œ€(TimeZone) ์ง€์› ๊ฐœ์„  ๐ŸŒ
  • ISO-8601 ํ‘œ์ค€ ์ค€์ˆ˜ ๐Ÿ“

์™€์šฐ! ์ •๋ง ๋งŽ์€ ๊ฐœ์„ ์ ์ด ์žˆ๋„ค. ํ•˜๋‚˜์”ฉ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž!

2.1 ๋ถˆ๋ณ€์„ฑ(Immutability) ๋ณด์žฅ ๐Ÿ›ก๏ธ

์ƒˆ๋กœ์šด API์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ”๋กœ ๋ถˆ๋ณ€์„ฑ์ด์•ผ. ์ด๊ฒŒ ๋ญ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•˜๋ƒ๊ณ ? ์—„์ฒญ ์ค‘์š”ํ•ด!

๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ํ•œ ๋ฒˆ ์ƒ์„ฑ๋˜๋ฉด ๊ทธ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์–ด. ์ฆ‰, ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋‹ค๋Š” ๊ฑฐ์ง€. ๋Œ€์‹  ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ด. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์žฅ์ ์ด ์žˆ์–ด:

  • ์“ฐ๋ ˆ๋“œ ์•ˆ์ „์„ฑ(Thread-safety) ๋ณด์žฅ ๐Ÿ‘
  • ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋™์ž‘ ๐Ÿ‘
  • ๊ฐ’์˜ ์•ˆ์ •์„ฑ ๐Ÿ‘

์˜ˆ๋ฅผ ๋“ค์–ด, LocalDate๋‚˜ LocalTime ๊ฐ™์€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ํ•œ ๋ฒˆ ์ƒ์„ฑ๋˜๋ฉด ์ ˆ๋Œ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„. ๋‚ ์งœ๋‚˜ ์‹œ๊ฐ„์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ด. ์ด๋ ‡๊ฒŒ:


LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plusDays(1);  // ์ƒˆ๋กœ์šด LocalDate ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

์—ฌ๊ธฐ์„œ today์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ , ๋Œ€์‹  ์ƒˆ๋กœ์šด LocalDate ์ธ์Šคํ„ด์Šค์ธ tomorrow๊ฐ€ ์ƒ์„ฑ๋ผ. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ์ ‘๊ทผํ•ด๋„ ์•ˆ์ „ํ•˜๊ณ , ์ฝ”๋“œ์˜ ๋™์ž‘์„ ์˜ˆ์ธกํ•˜๊ธฐ๋„ ์‰ฌ์›Œ์ ธ.

2.2 ๋ช…ํ™•ํ•œ ๊ตฌ๋ถ„: ์‚ฌ๋žŒ์„ ์œ„ํ•œ ์‹œ๊ฐ„ vs ๊ธฐ๊ณ„๋ฅผ ์œ„ํ•œ ์‹œ๊ฐ„ ๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘๐Ÿค–

Java 8 Date/Time API๋Š” ์‚ฌ๋žŒ์ด ์‚ฌ์šฉํ•˜๋Š” ์‹œ๊ฐ„๊ณผ ๊ธฐ๊ณ„๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์‹œ๊ฐ„์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•ด. ์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ด๋ƒ๋ฉด...

  • ์‚ฌ๋žŒ์„ ์œ„ํ•œ ์‹œ๊ฐ„: ์šฐ๋ฆฌ๊ฐ€ ์ผ์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋‚ ์งœ, ์‹œ๊ฐ„, ๊ธฐ๊ฐ„ ๋“ฑ์„ ๋‹ค๋ฃจ๋Š” ํด๋ž˜์Šค๋“ค์ด์•ผ. ์˜ˆ๋ฅผ ๋“ค๋ฉด LocalDate, LocalTime, LocalDateTime ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ์–ด.
  • ๊ธฐ๊ณ„๋ฅผ ์œ„ํ•œ ์‹œ๊ฐ„: ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ํ˜•ํƒœ์˜ ์‹œ๊ฐ„์„ ๋‹ค๋ฃจ๋Š” ํด๋ž˜์Šค์•ผ. ์ฃผ๋กœ Instant๋ฅผ ์‚ฌ์šฉํ•ด.

์ด๋ ‡๊ฒŒ ๊ตฌ๋ถ„ํ•˜๋ฉด ๋ญ๊ฐ€ ์ข‹์„๊นŒ? ์šฉ๋„์— ๋งž๋Š” ์ ์ ˆํ•œ ํด๋ž˜์Šค๋ฅผ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž์˜ ์ƒ์ผ์„ ์ €์žฅํ•  ๋•Œ๋Š” LocalDate๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋กœ๊ทธ ๊ธฐ๋ก ์‹œ๊ฐ„์€ Instant๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹์ด์ง€.

2.3 ๋‹ค์–‘ํ•œ ๋‚ ์งœ/์‹œ๊ฐ„ ๊ด€๋ จ ํด๋ž˜์Šค ์ œ๊ณต ๐Ÿ“š

Java 8 Date/Time API๋Š” ์ •๋ง ๋‹ค์–‘ํ•œ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•ด. ๊ฐ๊ฐ์˜ ํด๋ž˜์Šค๋Š” ํŠน์ •ํ•œ ์šฉ๋„์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์–ด์„œ, ์ƒํ™ฉ์— ๋งž๋Š” ๊ฐ€์žฅ ์ ์ ˆํ•œ ํด๋ž˜์Šค๋ฅผ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ์ฃผ์š” ํด๋ž˜์Šค๋“ค์„ ์‚ดํŽด๋ณผ๊นŒ?

์ฃผ์š” ๋‚ ์งœ/์‹œ๊ฐ„ ํด๋ž˜์Šค:

  • LocalDate: ๋‚ ์งœ๋งŒ ํ‘œํ˜„ (์˜ˆ: 2023-06-15)
  • LocalTime: ์‹œ๊ฐ„๋งŒ ํ‘œํ˜„ (์˜ˆ: 14:30:00)
  • LocalDateTime: ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ํ•จ๊ป˜ ํ‘œํ˜„ (์˜ˆ: 2023-06-15T14:30:00)
  • ZonedDateTime: ์‹œ๊ฐ„๋Œ€ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ๋‚ ์งœ์™€ ์‹œ๊ฐ„
  • Instant: ๊ธฐ๊ณ„๊ฐ€ ์ดํ•ดํ•˜๋Š” ์‹œ๊ฐ„ ํ‘œํ˜„ (1970๋…„ 1์›” 1์ผ UTC ์ž์ •๋ถ€ํ„ฐ์˜ ๋‚˜๋…ธ์ดˆ)
  • Duration: ๋‘ ์‹œ๊ฐ„ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ
  • Period: ๋‘ ๋‚ ์งœ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ

์™€! ์ •๋ง ๋‹ค์–‘ํ•˜์ง€? ๊ฐ ํด๋ž˜์Šค์˜ ์‚ฌ์šฉ ์˜ˆ๋ฅผ ๊ฐ„๋‹จํžˆ ๋ณผ๊นŒ?


// LocalDate ์‚ฌ์šฉ ์˜ˆ
LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1990, 1, 1);

// LocalTime ์‚ฌ์šฉ ์˜ˆ
LocalTime now = LocalTime.now();
LocalTime bedtime = LocalTime.of(22, 30);

// LocalDateTime ์‚ฌ์šฉ ์˜ˆ
LocalDateTime currentDateTime = LocalDateTime.now();
LocalDateTime futureDateTime = LocalDateTime.of(2025, 12, 25, 10, 30);

// ZonedDateTime ์‚ฌ์šฉ ์˜ˆ
ZonedDateTime tokyoTime = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));

// Instant ์‚ฌ์šฉ ์˜ˆ
Instant timestamp = Instant.now();

// Duration ์‚ฌ์šฉ ์˜ˆ
Duration timePassed = Duration.between(LocalTime.of(9, 0), LocalTime.of(17, 0));

// Period ์‚ฌ์šฉ ์˜ˆ
Period age = Period.between(birthday, today);

์ด๋ ‡๊ฒŒ ๋‹ค์–‘ํ•œ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ, ๊ฐœ๋ฐœ์ž๋“ค์€ ๊ฐ ์ƒํ™ฉ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ํด๋ž˜์Šค๋ฅผ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋์–ด. ์ด์ „์—๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ๋ชจ๋“  ์ƒํ™ฉ์„ ๋‹ค๋ค„์•ผ ํ–ˆ๋˜ ๊ฒƒ์— ๋น„ํ•˜๋ฉด ์ •๋ง ํฐ ๋ฐœ์ „์ด์ง€?

2.4 ๊ฐ•๋ ฅํ•œ ํฌ๋งคํŒ… ๊ธฐ๋Šฅ ๐ŸŽจ

๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋‹ค๋ฃจ๋‹ค ๋ณด๋ฉด ํฌ๋งคํŒ…์ด ์ •๋ง ์ค‘์š”ํ•ด. ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ๋•Œ๋Š” ์ฝ๊ธฐ ์‰ฌ์šด ํ˜•ํƒœ๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•  ๋•Œ๋Š” ํ‘œ์ค€ํ™”๋œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋‹ˆ๊นŒ. Java 8 Date/Time API๋Š” ์ด๋Ÿฐ ํฌ๋งคํŒ… ์ž‘์—…์„ ์ •๋ง ์‰ฝ๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค˜.

DateTimeFormatter ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ ํ˜•์‹์œผ๋กœ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ํฌ๋งคํŒ…ํ•  ์ˆ˜ ์žˆ์–ด. ๋ฏธ๋ฆฌ ์ •์˜๋œ ํฌ๋งคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ปค์Šคํ…€ ํฌ๋งคํ„ฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์ง€. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ?


LocalDate today = LocalDate.now();

// ๋ฏธ๋ฆฌ ์ •์˜๋œ ํฌ๋งคํ„ฐ ์‚ฌ์šฉ
String formattedDate = today.format(DateTimeFormatter.ISO_DATE);  // 2023-06-15

// ์ปค์Šคํ…€ ํฌ๋งคํ„ฐ ์‚ฌ์šฉ
DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("yyyy๋…„ MM์›” dd์ผ");
String koreanDate = today.format(customFormatter);  // 2023๋…„ 06์›” 15์ผ

// ๋ฌธ์ž์—ด์„ ๋‚ ์งœ๋กœ ํŒŒ์‹ฑ
LocalDate parsedDate = LocalDate.parse("2023-06-15", DateTimeFormatter.ISO_DATE);

์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ์›ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด. ๊ฒŒ๋‹ค๊ฐ€ parse() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ž์—ด์„ ๋‚ ์งœ/์‹œ๊ฐ„ ๊ฐ์ฒด๋กœ ์‰ฝ๊ฒŒ ๋ณ€ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์ง€. ์ด์ „์— ๋น„ํ•ด ์ •๋ง ํŽธ๋ฆฌํ•ด์กŒ์ง€?

2.5 ์‹œ๊ฐ„๋Œ€(TimeZone) ์ง€์› ๊ฐœ์„  ๐ŸŒ

๊ธ€๋กœ๋ฒŒ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ์‹œ๊ฐ„๋Œ€ ์ฒ˜๋ฆฌ๊ฐ€ ์ •๋ง ์ค‘์š”ํ•ด์ ธ. Java 8 Date/Time API๋Š” ์ด๋Ÿฐ ์‹œ๊ฐ„๋Œ€ ์ฒ˜๋ฆฌ๋ฅผ ํ›จ์”ฌ ์‰ฝ๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์คฌ์–ด.

ZoneId์™€ ZonedDateTime ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ์‹œ๊ฐ„๋Œ€์˜ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ?


// ํ˜„์žฌ ์‹œ์Šคํ…œ์˜ ๊ธฐ๋ณธ ์‹œ๊ฐ„๋Œ€ ์‚ฌ์šฉ
ZonedDateTime nowInSystemTZ = ZonedDateTime.now();

// ํŠน์ • ์‹œ๊ฐ„๋Œ€ ์‚ฌ์šฉ
ZonedDateTime nowInTokyo = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));

// ์‹œ๊ฐ„๋Œ€ ๋ณ€ํ™˜
ZonedDateTime nowInNewYork = nowInTokyo.withZoneSameInstant(ZoneId.of("America/New_York"));

// ์‹œ๊ฐ„๋Œ€ ๋ชฉ๋ก ํ™•์ธ
Set<string> availableZoneIds = ZoneId.getAvailableZoneIds();
</string>

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค์–‘ํ•œ ์‹œ๊ฐ„๋Œ€์˜ ์‹œ๊ฐ„์„ ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด. ์‹œ๊ฐ„๋Œ€ ๊ฐ„ ๋ณ€ํ™˜๋„ ์•„์ฃผ ๊ฐ„๋‹จํ•˜์ง€? ๊ฒŒ๋‹ค๊ฐ€ ZoneId.getAvailableZoneIds()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์‹œ๊ฐ„๋Œ€ ๋ชฉ๋ก์„ ์–ป์„ ์ˆ˜ ์žˆ์–ด์„œ ํŽธ๋ฆฌํ•ด.

2.6 ISO-8601 ํ‘œ์ค€ ์ค€์ˆ˜ ๐Ÿ“

Java 8 Date/Time API๋Š” ๊ตญ์ œ ํ‘œ์ค€์ธ ISO-8601์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋”ฐ๋ฅด๊ณ  ์žˆ์–ด. ์ด ํ‘œ์ค€์€ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ํ‘œํ˜„ํ•˜๋Š” ๊ตญ์ œ์ ์ธ ๊ทœ์•ฝ์ด์•ผ. ์ด๋ ‡๊ฒŒ ํ‘œ์ค€์„ ๋”ฐ๋ฅด๋ฉด ๋ญ๊ฐ€ ์ข‹์„๊นŒ?

  • ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ์ข‹์•„์ ธ ๐Ÿ‘
  • ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์–ด ๐Ÿ‘
  • ๊ตญ์ œํ™”(i18n)์™€ ์ง€์—ญํ™”(l10n)๊ฐ€ ์‰ฌ์›Œ์ ธ ๐Ÿ‘

์˜ˆ๋ฅผ ๋“ค์–ด, LocalDate๋‚˜ LocalDateTime์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ISO-8601 ํ˜•์‹์„ ๋”ฐ๋ผ๊ฐ€:


LocalDate date = LocalDate.of(2023, 6, 15);
System.out.println(date);  // 2023-06-15

LocalDateTime dateTime = LocalDateTime.of(2023, 6, 15, 14, 30, 0);
System.out.println(dateTime);  // 2023-06-15T14:30:00

์ด๋ ‡๊ฒŒ ํ‘œ์ค€์„ ๋”ฐ๋ฅด๋ฉด ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์ด๋‚˜ ์–ธ์–ด์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ํ›จ์”ฌ ์ˆ˜์›”ํ•ด์ ธ. ํŠนํžˆ ์›น ์„œ๋น„์Šค๋‚˜ RESTful API๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ์•„์ฃผ ์œ ์šฉํ•˜์ง€.

์ž, ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ Java 8 Date/Time API์˜ ์ฃผ์š” ํŠน์ง•๋“ค์ด์•ผ. ์ •๋ง ๋งŽ์€ ๊ฐœ์„ ์ด ์ด๋ค„์กŒ์ง€? ์ด์ „์— ๋น„ํ•ด ์–ผ๋งˆ๋‚˜ ํŽธ๋ฆฌํ•ด์กŒ๋Š”์ง€ ๋Š๊ปด์ง€์ง€ ์•Š์•„? ๐Ÿ˜Š

์ด์ œ ์šฐ๋ฆฌ๋Š” ์ด ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด. ๊ทธ๋Ÿผ ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ์‹ค์ œ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๋‹ค์Œ ์„น์…˜์—์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž! ์žฌ๋Šฅ๋„ท์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉด์„œ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. ๊ณ„์†ํ•ด์„œ ํ•จ๊ป˜ ์•Œ์•„๋ณด์ž! ๐Ÿš€

3. Java 8 Date/Time API ์‹ค์ „ ํ™œ์šฉํ•˜๊ธฐ ๐Ÿ’ช

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ์ด๋ก ์„ ์‹ค์ œ๋กœ ํ™œ์šฉํ•ด๋ณผ ์‹œ๊ฐ„์ด์•ผ! ๐ŸŽ‰ Java 8 Date/Time API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๊ด€๋ จ ์ž‘์—…์„ ์ •๋ง ์‰ฝ๊ณ  ํšจ์œจ์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์–ด. ์‹ค์ œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ž์ฃผ ๋งˆ์ฃผ์น˜๋Š” ์ƒํ™ฉ๋“ค์„ ์˜ˆ๋กœ ๋“ค์–ด๊ฐ€๋ฉฐ ์„ค๋ช…ํ•ด๋ณผ๊ฒŒ. ์ค€๋น„๋์–ด? ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ! ๐Ÿ˜„

3.1 ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๊ตฌํ•˜๊ธฐ ๐Ÿ“…โฐ

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ž‘์—…๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ? ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋Š” ๊ฑด ์ •๋ง ๊ฐ„๋‹จํ•ด!


// ํ˜„์žฌ ๋‚ ์งœ ๊ตฌํ•˜๊ธฐ
LocalDate today = LocalDate.now();
System.out.println("์˜ค๋Š˜ ๋‚ ์งœ: " + today);

// ํ˜„์žฌ ์‹œ๊ฐ„ ๊ตฌํ•˜๊ธฐ
LocalTime now = LocalTime.now();
System.out.println("ํ˜„์žฌ ์‹œ๊ฐ„: " + now);

// ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๊ตฌํ•˜๊ธฐ
LocalDateTime currentDateTime = LocalDateTime.now();
System.out.println("ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„: " + currentDateTime);

// ํŠน์ • ์‹œ๊ฐ„๋Œ€์˜ ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๊ตฌํ•˜๊ธฐ
ZonedDateTime tokyoTime = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
System.out.println("๋„์ฟ„ ํ˜„์žฌ ์‹œ๊ฐ„: " + tokyoTime);

์™€! ์ •๋ง ์ง๊ด€์ ์ด๊ณ  ์‰ฝ์ง€? ์ด์ „์— Calendar๋‚˜ Date๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์™€๋Š” ๋น„๊ต๋„ ์•ˆ ๋˜๊ฒŒ ๊ฐ„๋‹จํ•ด์กŒ์–ด.

3.2 ํŠน์ • ๋‚ ์งœ/์‹œ๊ฐ„ ์ƒ์„ฑํ•˜๊ธฐ ๐ŸŽ‚

ํŠน์ • ๋‚ ์งœ๋‚˜ ์‹œ๊ฐ„์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋„ ์•„์ฃผ ์‰ฌ์›Œ. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋„ค ์ƒ์ผ์ด๋‚˜ ์•ฝ์† ์‹œ๊ฐ„ ๊ฐ™์€ ๊ฑธ ํ‘œํ˜„ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€.


// ํŠน์ • ๋‚ ์งœ ์ƒ์„ฑ
LocalDate birthday = LocalDate.of(1990, 1, 1);
System.out.println("์ƒ์ผ: " + birthday);

// ํŠน์ • ์‹œ๊ฐ„ ์ƒ์„ฑ
LocalTime appointmentTime = LocalTime.of(14, 30);
System.out.println("์•ฝ์† ์‹œ๊ฐ„: " + appointmentTime);

// ํŠน์ • ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ์ƒ์„ฑ
LocalDateTime eventDateTime = LocalDateTime.of(2023, 12, 25, 18, 0);
System.out.println("์ด๋ฒคํŠธ ์ผ์‹œ: " + eventDateTime);

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์›ํ•˜๋Š” ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ์•„์ฃผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด. ๊ฒŒ๋‹ค๊ฐ€ ๊ฐ€๋…์„ฑ๋„ ์ข‹์ง€?

3.3 ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ์กฐ์ž‘ํ•˜๊ธฐ ๐Ÿ”ง

๋‚ ์งœ๋‚˜ ์‹œ๊ฐ„์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๊ณ„์‚ฐํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ๋งŽ์ง€? Java 8 Date/Time API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฐ ์ž‘์—…๋„ ์•„์ฃผ ์‰ฝ๊ณ  ์ง๊ด€์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์–ด.


LocalDate today = LocalDate.now();

// ๋‚ ์งœ ๋”ํ•˜๊ธฐ
LocalDate nextWeek = today.plusWeeks(1);
System.out.println("์ผ์ฃผ์ผ ํ›„: " + nextWeek);

// ๋‚ ์งœ ๋นผ๊ธฐ
LocalDate lastMonth = today.minusMonths(1);
System.out.println("ํ•œ ๋‹ฌ ์ „: " + lastMonth);

// ํŠน์ • ํ•„๋“œ ๋ณ€๊ฒฝ
LocalDate firstDayOfMonth = today.withDayOfMonth(1);
System.out.println("์ด๋ฒˆ ๋‹ฌ์˜ ์ฒซ ๋‚ : " + firstDayOfMonth);

LocalTime now = LocalTime.now();

// ์‹œ๊ฐ„ ๋”ํ•˜๊ธฐ
LocalTime twoHoursLater = now.plusHours(  2);
System.out.println("2์‹œ๊ฐ„ ํ›„: " + twoHoursLater);

// ์‹œ๊ฐ„ ๋นผ๊ธฐ
LocalTime tenMinutesBefore = now.minusMinutes(10);
System.out.println("10๋ถ„ ์ „: " + tenMinutesBefore);

// ํŠน์ • ํ•„๋“œ ๋ณ€๊ฒฝ
LocalTime setToNoon = now.withHour(12).withMinute(0).withSecond(0);
System.out.println("์ •์˜ค๋กœ ์„ค์ •: " + setToNoon);

๋ณด์ด์ง€? ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋”ํ•˜๊ณ , ๋นผ๊ณ , ํŠน์ • ๋ถ€๋ถ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒŒ ์–ผ๋งˆ๋‚˜ ์ง๊ด€์ ์ด๊ณ  ์‰ฌ์›Œ์กŒ๋Š”์ง€! ๐Ÿ˜ƒ ์ด์ „์—๋Š” ์ด๋Ÿฐ ์ž‘์—…์„ ํ•  ๋•Œ๋งˆ๋‹ค ๋ณต์žกํ•œ ๊ณ„์‚ฐ์„ ํ•ด์•ผ ํ–ˆ๋Š”๋ฐ, ์ด์ œ๋Š” ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†์–ด์กŒ์–ด.

3.4 ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๋น„๊ตํ•˜๊ธฐ ๐Ÿ†š

๋‘ ๋‚ ์งœ๋‚˜ ์‹œ๊ฐ„์„ ๋น„๊ตํ•ด์•ผ ํ•  ๋•Œ๋„ ์žˆ์ง€? ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด๋–ค ๋‚ ์งœ๊ฐ€ ๋” ์ด์ „์ธ์ง€, ํ˜น์€ ๋‘ ์‹œ๊ฐ„ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์ด ์–ผ๋งˆ๋‚˜ ๋˜๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์„ ๋•Œ ๋ง์ด์•ผ. Java 8 Date/Time API๋Š” ์ด๋Ÿฐ ์ž‘์—…๋„ ์•„์ฃผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜.


LocalDate date1 = LocalDate.of(2023, 6, 1);
LocalDate date2 = LocalDate.of(2023, 6, 15);

// ๋‚ ์งœ ๋น„๊ต
boolean isBefore = date1.isBefore(date2);
System.out.println("date1์ด date2๋ณด๋‹ค ์ด์ „์ธ๊ฐ€์š”? " + isBefore);

// ๋‚ ์งœ ๊ฐ„ ์ฐจ์ด ๊ณ„์‚ฐ
Period period = Period.between(date1, date2);
System.out.println("๋‘ ๋‚ ์งœ ์‚ฌ์ด์˜ ๊ธฐ๊ฐ„: " + period.getDays() + "์ผ");

LocalTime time1 = LocalTime.of(9, 0);
LocalTime time2 = LocalTime.of(17, 30);

// ์‹œ๊ฐ„ ๋น„๊ต
boolean isAfter = time2.isAfter(time1);
System.out.println("time2๊ฐ€ time1๋ณด๋‹ค ์ดํ›„์ธ๊ฐ€์š”? " + isAfter);

// ์‹œ๊ฐ„ ๊ฐ„ ์ฐจ์ด ๊ณ„์‚ฐ
Duration duration = Duration.between(time1, time2);
System.out.println("๋‘ ์‹œ๊ฐ„ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ: " + duration.toHours() + "์‹œ๊ฐ„ " + duration.toMinutesPart() + "๋ถ„");

์™€! ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋น„๊ตํ•˜๊ณ  ๊ทธ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒŒ ์ด๋ ‡๊ฒŒ ์‰ฌ์›Œ์กŒ์–ด. ํŠนํžˆ Period์™€ Duration ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ ์งœ๋‚˜ ์‹œ๊ฐ„ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์•„์ฃผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์ง€.

3.5 ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ํŒŒ์‹ฑ ๋ฐ ํฌ๋งคํŒ… ๐ŸŽจ

๋ฌธ์ž์—ด์„ ๋‚ ์งœ/์‹œ๊ฐ„ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜, ๋ฐ˜๋Œ€๋กœ ๋‚ ์งœ/์‹œ๊ฐ„ ๊ฐ์ฒด๋ฅผ ์›ํ•˜๋Š” ํ˜•์‹์˜ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ๋งŽ์ง€? Java 8 Date/Time API๋Š” ์ด๋Ÿฐ ์ž‘์—…์„ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ด.


// ๋ฌธ์ž์—ด์„ ๋‚ ์งœ๋กœ ํŒŒ์‹ฑ
LocalDate parsedDate = LocalDate.parse("2023-06-15");
System.out.println("ํŒŒ์‹ฑ๋œ ๋‚ ์งœ: " + parsedDate);

// ๋‚ ์งœ๋ฅผ ํŠน์ • ํ˜•์‹์˜ ๋ฌธ์ž์—ด๋กœ ํฌ๋งคํŒ…
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy๋…„ MM์›” dd์ผ");
String formattedDate = parsedDate.format(formatter);
System.out.println("ํฌ๋งคํŒ…๋œ ๋‚ ์งœ: " + formattedDate);

// ๋ฌธ์ž์—ด์„ ์‹œ๊ฐ„์œผ๋กœ ํŒŒ์‹ฑ
LocalTime parsedTime = LocalTime.parse("14:30");
System.out.println("ํŒŒ์‹ฑ๋œ ์‹œ๊ฐ„: " + parsedTime);

// ์‹œ๊ฐ„์„ ํŠน์ • ํ˜•์‹์˜ ๋ฌธ์ž์—ด๋กœ ํฌ๋งคํŒ…
formatter = DateTimeFormatter.ofPattern("HH์‹œ mm๋ถ„");
String formattedTime = parsedTime.format(formatter);
System.out.println("ํฌ๋งคํŒ…๋œ ์‹œ๊ฐ„: " + formattedTime);

์ด๋ ‡๊ฒŒ DateTimeFormatter๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์›ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ์ž์œ ๋กญ๊ฒŒ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด. ํŠนํžˆ ๋‹ค๊ตญ์–ด ์ง€์›์ด ํ•„์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์ด ๊ธฐ๋Šฅ์ด ์•„์ฃผ ์œ ์šฉํ•˜์ง€!

3.6 ์‹œ๊ฐ„๋Œ€ ๋‹ค๋ฃจ๊ธฐ ๐ŸŒ

๊ธ€๋กœ๋ฒŒ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ๋‹ค์–‘ํ•œ ์‹œ๊ฐ„๋Œ€๋ฅผ ๋‹ค๋ค„์•ผ ํ•  ๋•Œ๊ฐ€ ๋งŽ์•„. Java 8 Date/Time API๋Š” ์ด๋Ÿฐ ์ž‘์—…์„ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค˜.


// ํ˜„์žฌ ์‹œ์Šคํ…œ์˜ ๊ธฐ๋ณธ ์‹œ๊ฐ„๋Œ€ ํ™•์ธ
ZoneId systemZone = ZoneId.systemDefault();
System.out.println("์‹œ์Šคํ…œ ๊ธฐ๋ณธ ์‹œ๊ฐ„๋Œ€: " + systemZone);

// ํŠน์ • ์‹œ๊ฐ„๋Œ€์˜ ํ˜„์žฌ ์‹œ๊ฐ„ ๊ตฌํ•˜๊ธฐ
ZonedDateTime tokyoTime = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
System.out.println("๋„์ฟ„ ํ˜„์žฌ ์‹œ๊ฐ„: " + tokyoTime);

// ์‹œ๊ฐ„๋Œ€ ๋ณ€ํ™˜
ZonedDateTime newYorkTime = tokyoTime.withZoneSameInstant(ZoneId.of("America/New_York"));
System.out.println("๋‰ด์š• ์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ™˜: " + newYorkTime);

// ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‹œ๊ฐ„๋Œ€ ๋ชฉ๋ก ํ™•์ธ
Set<string> availableZoneIds = ZoneId.getAvailableZoneIds();
System.out.println("์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‹œ๊ฐ„๋Œ€ ์ˆ˜: " + availableZoneIds.size());
</string>

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค์–‘ํ•œ ์‹œ๊ฐ„๋Œ€์˜ ์‹œ๊ฐ„์„ ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด. ํŠนํžˆ ZonedDateTime์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ๊ฐ„๋Œ€ ๊ฐ„ ๋ณ€ํ™˜์ด ์•„์ฃผ ๊ฐ„๋‹จํ•ด์ง€์ง€.

3.7 ์‹ค์ „ ์˜ˆ์ œ: ์ผ์ • ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๐Ÿ“…

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์ข…ํ•ฉํ•ด์„œ ๊ฐ„๋‹จํ•œ ์ผ์ • ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด๋ณผ๊นŒ? ์ด ์‹œ์Šคํ…œ์€ ์ผ์ •์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๋‹ค๊ฐ€์˜ค๋Š” ์ผ์ •์„ ํ™•์ธํ•˜๊ณ , ์ผ์ • ๊ฐ„์˜ ๊ฐ„๊ฒฉ์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์งˆ ๊ฑฐ์•ผ.


import java.time.*;
import java.time.format.*;
import java.util.*;

public class ScheduleManager {
    private List<localdatetime> schedules = new ArrayList<>();
    private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");

    public void addSchedule(String dateTimeStr) {
        LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, formatter);
        schedules.add(dateTime);
        System.out.println("์ผ์ •์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค: " + dateTime.format(formatter));
    }

    public void showUpcomingSchedules() {
        LocalDateTime now = LocalDateTime.now();
        System.out.println("๋‹ค๊ฐ€์˜ค๋Š” ์ผ์ •:");
        schedules.stream()
                 .filter(schedule -> schedule.isAfter(now))
                 .sorted()
                 .forEach(schedule -> System.out.println(schedule.format(formatter)));
    }

    public void calculateIntervalBetweenSchedules() {
        if (schedules.size() < 2) {
            System.out.println("์ผ์ •์ด 2๊ฐœ ์ด์ƒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.");
            return;
        }
        Collections.sort(schedules);
        for (int i = 0; i < schedules.size() - 1; i++) {
            LocalDateTime schedule1 = schedules.get(i);
            LocalDateTime schedule2 = schedules.get(i + 1);
            Duration duration = Duration.between(schedule1, schedule2);
            System.out.println("์ผ์ • ๊ฐ„ ๊ฐ„๊ฒฉ: " + duration.toDays() + "์ผ " + duration.toHoursPart() + "์‹œ๊ฐ„ " + duration.toMinutesPart() + "๋ถ„");
        }
    }

    public static void main(String[] args) {
        ScheduleManager manager = new ScheduleManager();
        manager.addSchedule("2023-06-20 14:00");
        manager.addSchedule("2023-06-25 10:30");
        manager.addSchedule("2023-07-01 09:00");
        manager.showUpcomingSchedules();
        manager.calculateIntervalBetweenSchedules();
    }
}
</localdatetime>

์ด ์˜ˆ์ œ์—์„œ ์šฐ๋ฆฌ๋Š” Java 8 Date/Time API์˜ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ–ˆ์–ด:

  • LocalDateTime์„ ์‚ฌ์šฉํ•ด ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ํ•จ๊ป˜ ํ‘œํ˜„ํ–ˆ์–ด.
  • DateTimeFormatter๋ฅผ ์‚ฌ์šฉํ•ด ๋ฌธ์ž์—ด๊ณผ LocalDateTime ๊ฐ์ฒด ๊ฐ„์˜ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ–ˆ์ง€.
  • isAfter() ๋ฉ”์„œ๋“œ๋กœ ํ˜„์žฌ ์‹œ๊ฐ„ ์ดํ›„์˜ ์ผ์ •๋งŒ ํ•„ํ„ฐ๋งํ–ˆ์–ด.
  • Duration์„ ์‚ฌ์šฉํ•ด ๋‘ ์ผ์ • ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ๊ณ„์‚ฐํ–ˆ์ง€.

์ด๋ ‡๊ฒŒ Java 8 Date/Time API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๊ด€๋ จ ์ž‘์—…์„ ํ›จ์”ฌ ๋” ์‰ฝ๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด. ํŠนํžˆ ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ–์ถ˜ ๊ฐ์ฒด๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€.

์ž, ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ Java 8 Date/Time API์˜ ์‹ค์ „ ํ™œ์šฉ๋ฒ•์ด์•ผ. ์–ด๋•Œ? ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์ง€? ๐Ÿ˜Š ์ด์ œ ๋„ˆ๋„ ์ด ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๊ด€๋ จ ์ž‘์—…์„ ์ž์‹ ์žˆ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. ๊ณ„์†ํ•ด์„œ ์—ฐ์Šตํ•˜๊ณ  ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด๋ฉด ๋” ๊นŠ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. ํ™”์ดํŒ…! ๐Ÿš€

4. Java 8 Date/Time API ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ ๋ฐ ํŒ ๐Ÿšจ๐Ÿ’ก

์ž, ์ด์ œ Java 8 Date/Time API์˜ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•˜์œผ๋‹ˆ, ์ด๋ฅผ ๋” ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์˜์‚ฌํ•ญ๊ณผ ํŒ์„ ์•Œ์•„๋ณผ๊นŒ? ์ด๋Ÿฐ ๋‚ด์šฉ๋“ค์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ๋” ๊น”๋”ํ•˜๊ณ  ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. ์ค€๋น„๋์–ด? ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ! ๐Ÿš€

4.1 ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ฑ ๐Ÿ”„

Java 8 ์ด์ „์˜ ์ฝ”๋“œ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ์ž‘์—…ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์„ ๊ฑฐ์•ผ. ์ด๋Ÿด ๋•Œ๋Š” ์ƒˆ๋กœ์šด API์™€ ์ด์ „ API ์‚ฌ์ด์˜ ๋ณ€ํ™˜์ด ํ•„์š”ํ•ด.


// java.util.Date๋ฅผ Instant๋กœ ๋ณ€ํ™˜
Date legacyDate = new Date();
Instant instant = legacyDate.toInstant();

// Instant๋ฅผ java.util.Date๋กœ ๋ณ€ํ™˜
Date newDate = Date.from(instant);

// java.util.Calendar๋ฅผ ZonedDateTime์œผ๋กœ ๋ณ€ํ™˜
Calendar calendar = Calendar.getInstance();
ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(calendar.toInstant(), calendar.getTimeZone().toZoneId());

// ZonedDateTime์„ java.util.Calendar๋กœ ๋ณ€ํ™˜
Calendar newCalendar = GregorianCalendar.from(zonedDateTime);

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒˆ๋กœ์šด API์™€ ์ด์ „ API ์‚ฌ์ด๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์˜ค๊ฐˆ ์ˆ˜ ์žˆ์–ด. ํ•˜์ง€๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ƒˆ๋กœ์šด API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„. ๋” ์•ˆ์ „ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌํ•˜๊ฑฐ๋“ .

4.2 ์‹œ๊ฐ„๋Œ€ ์ฒ˜๋ฆฌ ์‹œ ์ฃผ์˜์‚ฌํ•ญ ๐ŸŒ

์‹œ๊ฐ„๋Œ€๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ํŠนํžˆ ์ฃผ์˜ํ•ด์•ผ ํ•ด. ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋ฅผ ์‚ดํŽด๋ณผ๊นŒ?

  • ๊ฐ€๋Šฅํ•˜๋ฉด ํ•ญ์ƒ UTC(Coordinated Universal Time)๋ฅผ ์‚ฌ์šฉํ•ด ์‹œ๊ฐ„์„ ์ €์žฅํ•˜๊ณ , ํ‘œ์‹œํ•  ๋•Œ๋งŒ ๋กœ์ปฌ ์‹œ๊ฐ„๋Œ€๋กœ ๋ณ€ํ™˜ํ•ด.
  • ์‹œ๊ฐ„๋Œ€ ์ด๋ฆ„์„ ํ•˜๋“œ์ฝ”๋”ฉํ•˜์ง€ ๋งˆ. ๋Œ€์‹  ZoneId.of()๋ฅผ ์‚ฌ์šฉํ•ด.
  • ์ผ๊ด‘ ์ ˆ์•ฝ ์‹œ๊ฐ„์ œ(DST)๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ด. ZonedDateTime์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ค˜.

// UTC ์‹œ๊ฐ„ ์ €์žฅ
Instant utcTime = Instant.now();

// ํ‘œ์‹œํ•  ๋•Œ ๋กœ์ปฌ ์‹œ๊ฐ„๋Œ€๋กœ ๋ณ€ํ™˜
ZonedDateTime localTime = utcTime.atZone(ZoneId.systemDefault());

// ์‹œ๊ฐ„๋Œ€ ์ด๋ฆ„ ์‚ฌ์šฉ (ํ•˜๋“œ์ฝ”๋”ฉ ๋Œ€์‹ )
ZoneId newYorkZone = ZoneId.of("America/New_York");

// DST ๊ณ ๋ ค (3์›”์˜ ๋งˆ์ง€๋ง‰ ์ผ์š”์ผ ์ƒˆ๋ฒฝ 2์‹œ)
ZonedDateTime dstStart = ZonedDateTime.of(2023, 3, 26, 2, 0, 0, 0, newYorkZone);
ZonedDateTime hourLater = dstStart.plusHours(1);
System.out.println("DST ์‹œ์ž‘ ์‹œ๊ฐ„: " + dstStart);
System.out.println("1์‹œ๊ฐ„ ํ›„: " + hourLater);

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‹œ๊ฐ„๋Œ€ ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ๋งŽ์ด ์ค„์ผ ์ˆ˜ ์žˆ์–ด.

4.3 ์„ฑ๋Šฅ ๊ณ ๋ ค์‚ฌํ•ญ ๐Ÿš€

Java 8 Date/Time API๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด์ง€๋งŒ, ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์ƒํ™ฉ์—์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ ์ด ์žˆ์–ด.

  • ๋ฐ˜๋ณต๋ฌธ ์•ˆ์—์„œ now() ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ํ˜ธ์ถœํ•˜์ง€ ๋งˆ. ๋Œ€์‹  ๋ฃจํ”„ ๋ฐ–์—์„œ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœํ•˜๊ณ  ๊ทธ ๊ฐ’์„ ์‚ฌ์šฉํ•ด.
  • ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ”ผํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ํฌ๋งคํ„ฐ๋Š” ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด.
  • ์‹œ๊ฐ„ ๋น„๊ต ์‹œ isBefore(), isAfter(), isEqual() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด. ์ด๋“ค์ด compareTo()๋ณด๋‹ค ๋” ๋ช…ํ™•ํ•˜๊ณ  ์•ฝ๊ฐ„ ๋” ๋นจ๋ผ.

// ์ข‹์€ ์˜ˆ
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate now = LocalDate.now();
for (LocalDate date : dates) {
    if (date.isBefore(now)) {
        String formatted = date.format(formatter);
        // ์ž‘์—… ์ˆ˜ํ–‰
    }
}

// ๋‚˜์œ ์˜ˆ
for (LocalDate date : dates) {
    if (date.isBefore(LocalDate.now())) {  // ๋งค๋ฒˆ now()๋ฅผ ํ˜ธ์ถœ
        String formatted = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));  // ๋งค๋ฒˆ ์ƒˆ ํฌ๋งคํ„ฐ ์ƒ์„ฑ
        // ์ž‘์—… ์ˆ˜ํ–‰
    }
}

์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์„ฑ๋Šฅ์„ ์กฐ๊ธˆ ๋” ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์–ด.

4.4 ๋‚ ์งœ ์—ฐ์‚ฐ ์‹œ ์ฃผ์˜์‚ฌํ•ญ ๐Ÿ“…

๋‚ ์งœ๋ฅผ ๋”ํ•˜๊ฑฐ๋‚˜ ๋บ„ ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์ด ์žˆ์–ด. ํŠนํžˆ ์›”์ด๋‚˜ ๋…„์„ ๋”ํ•˜๊ฑฐ๋‚˜ ๋บ„ ๋•Œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์–ด.


LocalDate date = LocalDate.of(2024, 1, 31);  // 2024๋…„ 1์›” 31์ผ
LocalDate oneMonthLater = date.plusMonths(1);
System.out.println(oneMonthLater);  // 2024-02-29 ์ถœ๋ ฅ

LocalDate twoMonthsLater = date.plusMonths(2);
System.out.println(twoMonthsLater);  // 2024-03-31 ์ถœ๋ ฅ

๋ณด์ด์ง€? 1์›” 31์ผ์—์„œ ํ•œ ๋‹ฌ์„ ๋”ํ–ˆ์„ ๋•Œ 2์›” 29์ผ์ด ๋์–ด. ์ด๋Š” 2024๋…„์ด ์œค๋…„์ด๊ธฐ ๋•Œ๋ฌธ์ด์•ผ. ์ด๋Ÿฐ ๋™์ž‘์ด ์˜๋„ํ•œ ๋Œ€๋กœ์ธ์ง€ ํ•ญ์ƒ ํ™•์ธํ•ด์•ผ ํ•ด.

4.5 ๋ถˆ๋ณ€์„ฑ(Immutability) ํ™œ์šฉํ•˜๊ธฐ ๐Ÿ›ก๏ธ

Java 8 Date/Time API์˜ ๋ชจ๋“  ํด๋ž˜์Šค๋Š” ๋ถˆ๋ณ€์ด์•ผ. ์ด ํŠน์„ฑ์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ๋” ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด.


// ์ข‹์€ ์˜ˆ
LocalDate date = LocalDate.of(2023, 6, 15);
LocalDate newDate = date.plusDays(1);  // ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ

// ๋‚˜์œ ์˜ˆ (ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ ์—๋Ÿฌ๋Š” ์•„๋‹˜)
LocalDate date = LocalDate.of(2023, 6, 15);
date.plusDays(1);  // ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
System.out.println(date);  // ์—ฌ์ „ํžˆ 2023-06-15 ์ถœ๋ ฅ

๋‚ ์งœ๋‚˜ ์‹œ๊ฐ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” ํ•ญ์ƒ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ƒˆ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ฑฐ๋‚˜, ๊ฐ™์€ ๋ณ€์ˆ˜์— ์žฌํ• ๋‹นํ•ด์•ผ ํ•ด. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋˜์ง€ ์•Š์•„.

4.6 ๋ฌธ์ž์—ด ํŒŒ์‹ฑ ์‹œ ์ฃผ์˜์‚ฌํ•ญ ๐Ÿ“

๋ฌธ์ž์—ด์„ ๋‚ ์งœ/์‹œ๊ฐ„ ๊ฐ์ฒด๋กœ ํŒŒ์‹ฑํ•  ๋•Œ๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์žŠ์ง€ ๋งˆ. DateTimeParseException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ .


try {
    LocalDate date = LocalDate.parse("2023-06-15");
    System.out.println(date);
} catch (DateTimeParseException e) {
    System.out.println("๋‚ ์งœ ํ˜•์‹์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค: " + e.getMessage());
}

๋˜ํ•œ, ๊ฐ€๋Šฅํ•˜๋ฉด ๋ฏธ๋ฆฌ ์ •์˜๋œ ํฌ๋งคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹์•„. ์ปค์Šคํ…€ ํฌ๋งคํ„ฐ๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” DateTimeFormatterBuilder๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•ด.

4.7 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๋™ ๐Ÿ’พ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๋™ํ•  ๋•Œ๋Š” JDBC 4.2 ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„. ์ด ๋ฒ„์ „๋ถ€ํ„ฐ Java 8 Date/Time API์™€ ํ˜ธํ™˜๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ฑฐ๋“ .


// ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ
LocalDateTime now = LocalDateTime.now();
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO events (event_time) VALUES (?)");
pstmt.setObject(1, now);
pstmt.executeUpdate();

// ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฝ๊ธฐ
ResultSet rs = stmt.executeQuery("SELECT event_time FROM events");
while (rs.next()) {
    LocalDateTime eventTime = rs.getObject("event_time", LocalDateTime.class);
    System.out.println(eventTime);
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ Java ์ฝ”๋“œ ์‚ฌ์ด์—์„œ ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด.

4.8 ํ…Œ์ŠคํŠธ ์‹œ ๊ณ ๋ ค์‚ฌํ•ญ ๐Ÿงช

๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋‹ค๋ฃจ๋Š” ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋•Œ๋Š” ํ˜„์žฌ ์‹œ๊ฐ„์— ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ด. Clock ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด.


public class TimeService {
    private Clock clock;

    public TimeService(Clock clock) {
        this.clock = clock;
    }

    public LocalDateTime getCurrentTime() {
        return LocalDateTime.now(clock);
    }
}

// ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
@Test
public void testGetCurrentTime() {
    Clock fixedClock = Clock.fixed(Instant.parse("2023-06-15T10:15:30Z"), ZoneId.of("UTC"));
    TimeService timeService = new TimeService(fixedClock);
    assertEquals(LocalDateTime.parse("2023-06-15T10:15:30"), timeService.getCurrentTime());
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ˜„์žฌ ์‹œ๊ฐ„์— ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์–ด, ํ…Œ์ŠคํŠธ์˜ ์•ˆ์ •์„ฑ์ด ๋†’์•„์ง€์ง€.

์ž, ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ Java 8 Date/Time API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์•Œ์•„๋‘๋ฉด ์ข‹์„ ์ฃผ์˜์‚ฌํ•ญ๊ณผ ํŒ๋“ค์ด์•ผ. ์ด๋Ÿฐ ๋‚ด์šฉ๋“ค์„ ์ž˜ ๊ธฐ์–ตํ•˜๊ณ  ์ ์šฉํ•˜๋ฉด, ๋” ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋‚ ์งœ/์‹œ๊ฐ„ ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. ๊ณ„์†ํ•ด์„œ ์‹ค์Šตํ•˜๊ณ  ๊ฒฝํ—˜์„ ์Œ“์•„๊ฐ€๋ฉด์„œ ์ด ๊ฐ•๋ ฅํ•œ API๋ฅผ ๋งˆ์Šคํ„ฐํ•ด๋‚˜๊ฐ€๊ธธ ๋ฐ”๋ผ! ํ™”์ดํŒ…! ๐Ÿ’ช๐Ÿ˜Š

5. ๊ฒฐ๋ก  ๋ฐ ๋งˆ๋ฌด๋ฆฌ ๐ŸŽฌ

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ์™”์–ด! Java 8 Date/Time API์— ๋Œ€ํ•ด ์ •๋ง ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์› ์ง€? ์ด์ œ ์šฐ๋ฆฌ์˜ ์—ฌ์ •์„ ๋งˆ๋ฌด๋ฆฌ ์ง€์–ด๋ณผ๊นŒ? ๐Ÿ˜Š

5.1 ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๊ฒƒ ๐Ÿ“š

์šฐ๋ฆฌ๋Š” ์ด ๊ธด ์—ฌ์ •์„ ํ†ตํ•ด ์ •๋ง ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์› ์–ด:

  • Java 8 ์ด์ „์˜ ๋‚ ์งœ/์‹œ๊ฐ„ API์˜ ๋ฌธ์ œ์ 
  • Java 8 Date/Time API์˜ ์ฃผ์š” ํŠน์ง•๊ณผ ์žฅ์ 
  • ์ƒˆ๋กœ์šด API์˜ ํ•ต์‹ฌ ํด๋ž˜์Šค๋“ค (LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Instant ๋“ฑ)
  • ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋‹ค๋ฃจ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ• (์ƒ์„ฑ, ์กฐ์ž‘, ๋น„๊ต, ํฌ๋งคํŒ… ๋“ฑ)
  • ์‹œ๊ฐ„๋Œ€ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•
  • API ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ๊ณผ ํŒ

์™€! ์ •๋ง ๋งŽ์ด ๋ฐฐ์› ๋„ค, ๊ทธ๋ ‡์ง€? ๐Ÿ‘

5.2 Java 8 Date/Time API์˜ ์ค‘์š”์„ฑ ๐ŸŒŸ

์ด ์ƒˆ๋กœ์šด API๊ฐ€ ์™œ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ• ๊นŒ? ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๋ฅผ ์ •๋ฆฌํ•ด๋ณผ๊ฒŒ:

  • ์•ˆ์ •์„ฑ: ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•ด.
  • ๋ช…ํ™•์„ฑ: ์ง๊ด€์ ์ธ ๋ฉ”์„œ๋“œ ์ด๋ฆ„๊ณผ ์ผ๊ด€๋œ ๋””์ž์ธ์œผ๋กœ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์—ฌ์ค˜.
  • ๊ธฐ๋Šฅ์„ฑ: ๋‹ค์–‘ํ•œ ๋‚ ์งœ/์‹œ๊ฐ„ ๊ด€๋ จ ์—ฐ์‚ฐ๊ณผ ๋ณ€ํ™˜์„ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด.
  • ๊ตญ์ œํ™”: ์‹œ๊ฐ„๋Œ€ ์ฒ˜๋ฆฌ๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์ ธ์„œ ๊ธ€๋กœ๋ฒŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ด ํŽธ๋ฆฌํ•ด์กŒ์–ด.
  • ํ™•์žฅ์„ฑ: ํ•„์š”์— ๋”ฐ๋ผ ์ปค์Šคํ…€ ํ•„๋“œ๋‚˜ ์ฟผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด.

์ด๋Ÿฐ ํŠน์ง•๋“ค ๋•๋ถ„์— Java 8 Date/Time API๋Š” ํ˜„๋Œ€์ ์ธ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ํ•„์ˆ˜์ ์ธ ๋„๊ตฌ๊ฐ€ ๋์–ด.

5.3 ์•ž์œผ๋กœ์˜ ํ•™์Šต ๋ฐฉํ–ฅ ๐Ÿš€

์—ฌ๊ธฐ์„œ ๋ฐฐ์šด ๋‚ด์šฉ์€ ์‹œ์ž‘์ผ ๋ฟ์ด์•ผ. ๋” ๊นŠ์ด ์žˆ๋Š” ํ•™์Šต์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ์–ด:

  • ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด๊ธฐ: ์ด๋ก ์„ ์•„๋Š” ๊ฒƒ๊ณผ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฅด๊ฑฐ๋“ . ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด๋ฉด์„œ ๊ฒฝํ—˜์„ ์Œ“์•„๊ฐ€๋ด.
  • ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ํƒ๊ตฌํ•˜๊ธฐ: TemporalAdjusters, DateTimeFormatterBuilder ๋“ฑ ๋” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค์„ ํ•™์Šตํ•ด๋ด.
  • ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ํ†ตํ•ฉ: Spring Framework, Hibernate ๋“ฑ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค๊ณผ Java 8 Date/Time API๋ฅผ ์–ด๋–ป๊ฒŒ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ด.
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”: ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ Date/Time API๋ฅผ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฐ๊ตฌํ•ด๋ด.
  • Java 9 ์ดํ›„์˜ ๋ณ€ํ™” ์‚ดํŽด๋ณด๊ธฐ: Java 9 ์ดํ›„ ๋ฒ„์ „์—์„œ Date/Time API์— ์–ด๋–ค ๋ณ€ํ™”๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ ํ™•์ธํ•ด๋ด.

5.4 ๋งˆ๋ฌด๋ฆฌ ์ธ์‚ฌ ๐Ÿ‘‹

์ž, ์ด์ œ ์ •๋ง ๋์ด์•ผ. ๊ธด ์—ฌ์ •์ด์—ˆ์ง€ ๋งŒ? ํ•˜์ง€๋งŒ ์ด ์—ฌ์ •์„ ํ†ตํ•ด ๋„ˆ๋Š” Java 8 Date/Time API์˜ ์ „๋ฌธ๊ฐ€๊ฐ€ ๋˜์—ˆ์–ด! ๐ŸŽ‰

์ด API๋ฅผ ๋งˆ์Šคํ„ฐํ•จ์œผ๋กœ์จ, ๋„ˆ๋Š” ์ด์ œ ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๊ด€๋ จ ์ž‘์—…์„ ๋” ์‰ฝ๊ณ , ์•ˆ์ „ํ•˜๊ณ , ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋์–ด. ์ด๋Š” ๋‹จ์ˆœํžˆ ๊ธฐ์ˆ ์ ์ธ ์Šคํ‚ฌ์„ ๋„˜์–ด์„œ, ๋” ๋‚˜์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ–๊ฒŒ ๋œ ๊ฑฐ์•ผ.

๊ธฐ์–ตํ•ด, ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ณ„์†ํ•ด์„œ ๋ฐฐ์šฐ๊ณ  ์„ฑ์žฅํ•˜๋Š” ์—ฌ์ •์ด์•ผ. Java 8 Date/Time API๋Š” ๊ทธ ์—ฌ์ •์˜ ์ค‘์š”ํ•œ ์ด์ •ํ‘œ ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ด์ง€. ์•ž์œผ๋กœ๋„ ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋ฐฐ์šฐ๊ณ , ๋„์ „ํ•˜๊ณ , ์„ฑ์žฅํ•ด ๋‚˜๊ฐ€๊ธธ ๋ฐ”๋ผ.

๋งˆ์ง€๋ง‰์œผ๋กœ, ์ด ๋ชจ๋“  ๋‚ด์šฉ์„ ๋๊นŒ์ง€ ํ•จ๊ป˜ ํ•ด์ค€ ๋„ˆ์—๊ฒŒ ๋ฐ•์ˆ˜๋ฅผ ๋ณด๋‚ด๊ณ  ์‹ถ์–ด ๐Ÿ‘๐Ÿ‘๐Ÿ‘ ์ •๋ง ๋Œ€๋‹จํ•ด! ์ด์ œ ๋„ˆ์˜ ์ฝ”๋“œ์— Java 8 Date/Time API๋ฅผ ์ ์šฉํ•ด๋ณด๋ฉด์„œ, ๊ทธ ๅจๅŠ›(์œ„๋ ฅ)์„ ์ง์ ‘ ๊ฒฝํ—˜ํ•ด๋ด. ๋ถ„๋ช… ๋„ˆ์˜ ์ฝ”๋”ฉ ์ƒํ™œ์— ํฐ ๋ณ€ํ™”๋ฅผ ๊ฐ€์ ธ๋‹ค์ค„ ๊ฑฐ์•ผ.

๊ทธ๋Ÿผ, ๋‹ค์Œ์— ๋˜ ๋‹ค๋ฅธ ์ฃผ์ œ๋กœ ๋งŒ๋‚˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ• ๊ฒŒ. ํ•ญ์ƒ ํ–‰์šด์ด ํ•จ๊ป˜ํ•˜๊ธฐ๋ฅผ! Happy Coding! ๐Ÿ˜Š๐Ÿš€