๐ŸŒฑ ์ธํ”„๋Ÿฐ/โ˜•๏ธ ๊น€์˜ํ•œ์˜ ์‹ค์ „ ์ž๋ฐ” - ์ค‘๊ธ‰ 1ํŽธ

์ž๋ฐ” ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด์ •๋ฆฌ

mallin 2025. 7. 7. 18:22

โ˜•๏ธ  ๊น€์˜ํ•œ์˜ ์‹ค์ „ ์ž๋ฐ” - ์ค‘๊ธ‰ 1ํŽธ ์„ ๋“ฃ๊ณ  ์ž‘์„ฑํ•˜๋Š” ๋ณต์Šต ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค.

 

0. ๋ฐฐ๊ฒฝ

ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๋‹ค๋ณด๋ฉด ๐Ÿ“… ๋‚ ์งœ์™€ ๐Ÿ•ฐ๏ธ ์‹œ๊ฐ„ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผํ•  ์ผ์ด ์ž์ฃผ ์ƒ๊ธด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ

๐Ÿ’ฐ ์ •์‚ฐ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•  ๊ฒฝ์šฐ ํŠน์ • ์‹œ์  ์‚ฌ์ด์˜ ์ •์‚ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๊ณ 

๐Ÿ‘†์ผ๋ฐ˜์ ์ธ ๋ฐ์ดํ„ฐ ์กฐํšŒ์—์„œ๋„ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋‚ ์งœ๋ฅผ ์ง€์ •ํ•ด์„œ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

์ž๋ฐ”์—๋Š” ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ์ด๋ฒˆ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž

 


1.  ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

๐Ÿ’ฌ "๊ตณ์ด ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ• ๊นŒ ?"

๐Ÿ’ฌ "๊ทธ๋ƒฅ ๋‚ด๊ฐ€ ํ•˜๋‚˜ํ•˜๋‚˜ ๊ณ„์‚ฐํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ ?" ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๊ทธ๋ƒฅ ๊ณ„์‚ฐํ•˜๊ธฐ์—” ๊ณ ๋ คํ•ด์•ผํ•  ์š”์†Œ๋“ค์ด ๋งŽ๋‹ค.

 

1. ๐ŸŒŽ ์œค๋…„

์ง€๊ตฌ๊ฐ€ ํƒœ์–‘์„ ํ•œ ๋ฐ”ํ€ด ๋„๋Š”๋ฐ ํ‰๊ท  365.425์ผ์ด ๊ฑธ๋ฆฐ๋‹ค.

์ •ํ™•ํžˆ 365์ผ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋จธ์ง€ 0.425์ผ์„ ๋”ํ•ด์„œ ์•ฝ 4๋…„๋งˆ๋‹ค ํ•˜๋ฃจ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์œค๋…„์„ ์‚ฌ์šฉํ•œ๋‹ค

 

2. โ˜€๏ธ ์ผ๊ด‘ ์ ˆ์•ฝ ์‹œ๊ฐ„

์ธ๋จธํƒ€์ž„์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.

๊ตญ๊ฐ€๋‚˜ ์ง€์—ญ์— ๋‹ค๋ผ ์ ์šฉ ์—ฌ๋ถ€์™€ ์‹œ์ž‘ ๋ฐ ์ข…๋ฃŒ ๋‚ ์งœ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋ผ๋ณ„๋กœ 1์‹œ๊ฐ„ ์˜ค์ฐจ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3. ๐Ÿ•ฐ๏ธ ํƒ€์ž„์กด

๋‚˜๋ผ๋งˆ๋‹ค ๋‹ค์–‘ํ•œ ํƒ€์ž„์กด์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋‹ค.

๊ฐ ํƒ€์ž„์กด์€ UTC ๋กœ๋ถ€ํ„ฐ์˜ ์‹œ๊ฐ„ ์ฐจ์ด๋กœ ์ •์˜๋œ๋‹ค.

 

์ด๋Ÿฐ ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๋‹ค์–‘ํ•œ ๊ฒƒ๋“ค์„ ๋ชจ๋‘ ๋ฐ˜์˜ํ•˜๊ธฐ์—” ํ˜ผ์ž ๊ฐœ๋ฐœํ•ด์„œ๋Š” ์–ด๋ ต๋‹ค 

→ ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ž˜ ์„ค๊ณ„๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.


2. ์ž๋ฐ” ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

https://docs.oracle.com/javase/tutorial/datetime/iso/overview.html

 

์˜ค๋ผํด์˜ ์ž๋ฐ” document ์— ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌ๋œ ํ‘œ๊ฐ€ ์žˆ๋‹ค

๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ช… ์„ค๋ช… ํ˜•์‹
LocalDate ๋‚ ์งœ๋งŒ ํ‘œํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ 2013-12-21
LocalTime ์‹œ๊ฐ„๋งŒ ํ‘œํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ 08:20:30.213
LocalDateTime ๋‚ ์งœ + ์‹œ๊ฐ„์„ ํ‘œํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ 2013-12-21T08:20:30.213
ZonedDateTime ์‹œ๊ฐ„๋Œ€๋ฅผ ๊ณ ๋ คํ•œ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ํ‘œํ˜„ (+ ํƒ€์ž„์กด ํฌํ•จ) 2013-11-21T08:20:30.213+9:00[Asia/Seoul]
OffsetDateTime ์‹œ๊ฐ„๋Œ€๋ฅผ ๊ณ ๋ คํ•œ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ํ‘œํ˜„ (+ ํƒ€์ž„์กด ๋ฏธํฌํ•จ) 2013-11-21T08:20:30.213+9:00
Instance UTC๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋Š” ์‹œ๊ฐ„์˜ ํ•œ ์ง€์   
Period ๋‘ ๋‚ ์งœ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ (๋…„ / ์›” / ์ผ)  
Duration ๋‘ ์‹œ๊ฐ„ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ (์‹œ / ๋ถ„ / ์ดˆ)  

 


3. LocalDate, LocalTime, LocalDateTime

๐Ÿ’ก ์‹œ๊ฐ„๋Œ€๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ , ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ

 

LocalDate, LocalTime, LocalDateTime ๋ชจ๋‘ ์•ž์— Local ์ด ๋ถ™๋Š”๋‹ค.

๐Ÿ™…‍โ™€๏ธ์ด๋Š” ์„ธ๊ณ„ ์‹œ๊ฐ„๋Œ€๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ๋กœ, ํƒ€์ž„์กด์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

 

LocalDate : ๋‚ ์งœ

LocalDate now = LocalDate.now();
LocalDate ofDate = LocalDate.of(2025, 7, 7);
LocalDate ofDatePlus10 = ofDate.plusDays(10);

System.out.println("now = " + now);
System.out.println("ofDate = " + ofDate);
System.out.println("ofDatePlus10 = " + ofDatePlus10);
now = 2025-07-07
ofDate = 2025-07-07
ofDatePlus10 = 2025-07-17

 

  • now() : ํ˜„์žฌ ๋‚ ์งœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ LocalDate ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค 
  • of(๋…„, ์›”, ์ผ) : ํŠน์ • ๋‚ ์งœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ LocalDate ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • plusDays(์ผ) : ์ผ์„ ๋”ํ•œ๋‹ค

 

 

 

LocalTime : ์‹œ๊ฐ„

LocalTime now = LocalTime.now();
LocalTime ofTime = LocalTime.of(12, 0, 0);
LocalTime ofTimePlusHour = ofTime.plusHours(10);

System.out.println("now = " + now);
System.out.println("ofTime = " + ofTime);
System.out.println("ofTimePlusHour = " + ofTimePlusHour);
now = 17:14:28.122669
ofTime = 12:00
ofTimePlusHour = 22:00
  • now() : ํ˜„์žฌ ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ LocalTime ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค 
  • of(์‹œ๊ฐ„, ๋ถ„, ์ดˆ) : ํŠน์ • ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ LocalTime ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • plusHours(์‹œ๊ฐ„) : ์‹œ๊ฐ„์„ ๋”ํ•œ๋‹ค

 

 

 

 

LocalDateTime : ๋‚ ์งœ + ์‹œ๊ฐ„

LocalDateTime now = LocalDateTime.now();
LocalDateTime ofDateTime = LocalDateTime.of(2025, 7, 7, 12, 0, 0);

LocalDateTime ofDateTimePlusDays = ofDateTime.plusDays(10);
LocalDateTime ofDateTimePlusHours = ofDateTime.plusHours(10);

System.out.println("now = " + now);
System.out.println("ofDateTime = " + ofDateTime);
System.out.println("ofDateTimePlusDays = " + ofDateTimePlusDays);
System.out.println("ofDateTimePlusHours = " + ofDateTimePlusHours);
now = 2025-07-07T17:17:33.380426
ofDateTime = 2025-07-07T12:00
ofDateTimePlusDays = 2025-07-17T12:00
ofDateTimePlusHours = 2025-07-07T22:00
  • now() : ํ˜„์žฌ ๋‚ ์งœ, ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ  LocalDateTime ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค 
  • of(๋…„, ์›”, ์ผ, ์‹œ๊ฐ„, ๋ถ„, ์ดˆ) : ํŠน์ • ๋‚ ์งœ, ์‹œ๊ฐ„ ์„ ๊ธฐ์ค€์œผ๋กœ LocalDateTime ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • plusHours(์‹œ๊ฐ„) : ์‹œ๊ฐ„์„ ๋”ํ•œ๋‹ค
  • plusDays(์ผ) : ์ผ์„ ๋”ํ•œ๋‹ค

→ LocalDateTime ์€ ์‹œ๊ฐ„๊ณผ ๋‚ ์งœ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— plusHours, plusDays ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

 


4. ZonedDateTime, OffsetDateTime

๐Ÿ’ก ํƒ€์ž„์กด์„ ๊ณ ๋ คํ•œ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ 

 

ZonedDateTime์€ ๋‹ค๋ฅธ ๋‚˜๋ผ์™€์˜ ํƒ€์ž„์กด์„ ๊ณ ๋ คํ•œ๋‹ค.

์ž๋ฐ”์—์„œ ํƒ€์ž„์กด์€ ZoneId ๋กœ ์ œ๊ณต๋œ๋‹ค.

 

ZoneId

for (String availableZoneId : ZoneId.getAvailableZoneIds()) {
    System.out.println(availableZoneId);
}

System.out.println("ZoneId.systemDefault = " + ZoneId.systemDefault());
System.out.println("ZoneId.of = " + ZoneId.of("Asia/Seoul"));
  • ZoneId.systemDefault() : ์‹œ์Šคํ…œ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ ZoneId ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค
  • ZoneId.of() : ์ž…๋ ฅ๋œ ํƒ€์ž„์กด์— ํ•ด๋‹นํ•˜๋Š” ZoneId ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค
  • ZoneId.getAvailableZoneIds() : ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ZoneId ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค 
  • DST (์„œ๋จธ ํƒ€์ž„) ์ •๋ณด๋ฅผ ํฌํ•จํ•œ๋‹ค.

 

ZonedDateTime

public final class ZonedDateTime implements Temporal, ChronoZonedDateTime<LocalDate>, Serializable {        
    private final LocalDateTime dateTime;
    private final ZoneOffset offset;
    private final ZoneId zone;
}

 

  • ZonedDateTime ์€ ๋‚ด๋ถ€์— LocalDateTime, ZoneOffset, ZoneId ๊ฐ€ ์žˆ๋‹ค
  • ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” LocalDateTime ์— ์‹œ๊ฐ„๋Œ€๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ํƒ€์ž„์กด์ด ํฌํ•จ๋œ๋‹ค.
ZonedDateTime zdt1 = ZonedDateTime.now();
System.out.println("zdt1 = " + zdt1);

ZonedDateTime zdt2 = ZonedDateTime.of(2030, 1, 1, 13, 30, 50, 0, ZoneId.of("Asia/Seoul"));
System.out.println("zdt2 = " + zdt2);

ZonedDateTime utcZdt = zdt2.withZoneSameInstant(ZoneId.of("UTC"));
System.out.println("utcZdt = " + utcZdt);
zdt1 = 2025-07-07T17:37:36.873016+09:00[Asia/Seoul]
zdt2 = 2030-01-01T13:30:50+09:00[Asia/Seoul]
utcZdt = 2030-01-01T04:30:50Z[UTC]
  • now() : ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์œผ๋กœ ์ƒ์„ฑ, ํƒ€์ž„์กด์€ ์‹œ์Šคํ…œ ์‹œ๊ฐ„์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค
  • of() : ํŠน์ • ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ์ƒ์„ฑ, ZoneId ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค
  • withZoneSameInstance(ZoneId) : ํ•ด๋‹น ์‹œ๊ฐ„์˜ ํƒ€์ž„์กด์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค

 

OffsetDateTime

public final class OffsetDateTime implements Temporal, TemporalAdjuster, Comparable<OffsetDateTime>, Serializable {
    private final LocalDateTime dateTime;
    private final ZoneOffset offset;
}
  • LocalDateTime ์— ZoneOffset ๋งŒ ์ถ”๊ฐ€๋˜์–ด ์žˆ๋‹ค
  • ZoneId ๊ฐ€ ์—†๊ธฐ ๋–„๋ฌธ์— ํƒ€์ž„์กด์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†๋‹ค
ZoneOffset

UTC ๊ธฐ์ค€์˜ ๊ณ ์ •๋œ ์‹œ๊ฐ„ ์ฐจ์ด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค ex) "+09:00", "-05:00" ๋“ฑ
์„œ๋จธํƒ€์ž„ (DST) ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค

OffsetDateTime nowOdt = OffsetDateTime.now();
System.out.println("nowOdt = " + nowOdt);

OffsetDateTime odt = OffsetDateTime.of(LocalDateTime.of(2030, 1, 1, 13, 30, 50), ZoneOffset.of("+01:00"));
System.out.println("odt = " + odt);
nowOdt = 2025-07-07T17:55:54.615875+09:00
odt = 2030-01-01T13:30:50+01:00
  • now() : ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์œผ๋กœ ์ƒ์„ฑ
  • of() : ํŠน์ • ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ์ƒ์„ฑ, Zoneoffset ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค

5. Instant

๐Ÿ’ก ์‹œ๊ฐ„๋Œ€ ๋ณ€ํ™˜ ์—†์ด ์‹œ๊ฐ„ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•  ๋•Œ 
public final class Instant implements Temporal, TemporalAdjuster, Comparable<Instant>, Serializable {
    private final long seconds;
    private final int nanos;
}
  • ๋‚ด๋ถ€์ ์œผ๋กœ ์ดˆ์™€ ๋‚˜๋…ธ์ดˆ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค
  • 1970๋…„ 1์›” ์ผ 0์‹œ 0๋ถ„ 0์ดˆ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฝ๊ณผํ•œ ์‹œ๊ฐ„์„ ๊ฐ€์ง„๋‹ค
  • UTC ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋Œ€์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค
  • ์‚ฌ๋žŒ์ด ์ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ์—๋Š” ์ง๊ด€์ ์ด์ง€ ์•Š๋‹ค

 

์‚ฌ์šฉ

  1. ์ „์„ธ๊ณ„์ ์ธ ์‹œ๊ฐ„ ๊ธฐ์ค€์ด ํ•„์š”ํ•  ๋•Œ 
  2. ์‹œ๊ฐ„๋Œ€ ๋ณ€ํ™˜ ์—†์ด ์‹œ๊ฐ„ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•  ๋•Œ 
  3. ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ๊ตํ™˜

์— ์‚ฌ์šฉ๋œ๋‹ค.

 

Instant now = Instant.now(); // UTC ๊ธฐ์ค€
System.out.println("now = " + now);
now = 2025-07-07T08:59:50.508822Z

 

์ดˆ๊ฐ€ ๋“ค์–ด์žˆ์ง€๋งŒ ์ถœ๋ ฅํ•  ๋•Œ๋Š” ๋‚ ์งœ ํ˜•์‹์— ๋งž์ถฐ์„œ ์ถœ๋ ฅ๋˜๋Š”๋ฐ

@Override
public String toString() {
    return DateTimeFormatter.ISO_INSTANT.format(this);
}

Instant ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ toString() ์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค


6. Duration, Period

๐Ÿ’ก ๋‘ ๋‚ ์งœ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์ด๋‚˜ ์‹œ๊ฐ„ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ๋‚˜ํƒ€๋‚ผ ๋•Œ 

Period ๋Š” ๋‘ ๋‚ ์งœ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ๋…„ / ์›” / ์ผ ๋‹จ์œ„๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค

// ์ƒ์„ฑ
Period period = Period.ofDays(10);
System.out.println("period = " + period);

// ๊ณ„์‚ฐ์— ์‚ฌ์šฉ
LocalDate plusDate = LocalDate.of(2030, 1, 1).plus(period);
System.out.println("plusDate = " + plusDate);

// ๊ธฐ๊ฐ„ ์ฐจ์ด
Period between = Period.between(LocalDate.of(2023, 1, 1), LocalDate.of(2023, 4, 2));
System.out.println("๊ธฐ๊ฐ„: " + between.getMonths() + "๊ฐœ์›” " + between.getDays() + "์ผ");
  • ofXXX() : ํŠน์ • ๊ธฐ๊ฐ„์„ ์ง€์ •ํ•ด์„œ Period ๋ฅผ ์ƒ์„ฑ
  • plus(Period period): ํŠน์ • ๋‚ ์งœ์— ๊ธฐ๊ฐ„์„ ๋”ํ•  ์ˆ˜ ์žˆ๋‹ค
  • between(startDate, endDate) : ํŠน์ • ๋‚ ์งœ์˜ ์ฐจ์ด๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค

 

Duration ์€ ๋‘ ์‹œ๊ฐ„ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์‹œ / ๋ถ„ / ์ดˆ ๋‹จ์œ„๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค

// ์ƒ์„ฑ
Duration duration = Duration.ofMinutes(30);
System.out.println("duration = " + duration);

// ๊ณ„์‚ฐ
LocalTime plusTime = LocalTime.of(1, 0).plus(duration);
System.out.println("๋”ํ•œ ์‹œ๊ฐ„: " + plusTime);

// ์‹œ๊ฐ„ ์ฐจ์ด
Duration between = Duration.between(LocalTime.of(9, 0), LocalTime.of(10, 0));
System.out.println("์ฐจ์ด : " + between.getSeconds() + "์ดˆ");
System.out.println("๊ทผ๋ฌด ์‹œ๊ฐ„: " + between.toHours() + "์‹œ๊ฐ„ " + between.toMinutesPart() + "๋ถ„");
  • ofXXX() : ํŠน์ • ์‹œ๊ฐ„์„ ์ง€์ •ํ•ด์„œ Period ์ƒ์„ฑ
  • plus() : LocalTime ์— Period ๋ฅผ ๋”ํ•  ์ˆ˜ ์žˆ๋‹ค
  • between() : LocalTime๊ฐ„์˜ ์ฐจ๋ฆฌ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค
  • toMinutes() : ์ „์ฒด ๋ถ„
  • toMinutesPart() : ์‹œ๊ฐ„์„ ๋นผ๊ณ  ๋‚œ ํ›„์˜ ๋ถ„

 

7. ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ํ•ต์‹ฌ ์ธํ„ฐํŽ˜์ด์Šค

๋‚ ์งœ์™€ ์‹œ๊ฐ„์€ ํŠน์ • ์‹œ์ ๊ณผ ๊ฐ„๊ฒฉ์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. 

  • ํŠน์ • ์‹œ์  : ๋‚ด ์ƒ์ผ์€ 2์›” 7์ผ์ด์•ผ 
  • ์‹œ๊ฐ„์˜ ๊ฐ„๊ฒฉ : ๋‚ด ์ƒ์ผ๊นŒ์ง€ 3์ผ ๋‚จ์•˜์–ด

 

ํŠน์ • ์‹œ์ ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํด๋ž˜์Šค๋Š” ์•ž์—์„œ ์‚ดํŽด๋ดค๋˜

  • LocalDateTime
  • ZonedDateTime
  • Instance 

๊ฐ€ ์žˆ๊ณ , ๊ฐ ํด๋ž˜์Šค๋Š” Temporal ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , Temporal ์ธํ„ฐํŽ˜์ด์Šค๋Š” TemporalAccessor ๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค

 

 

์‹œ๊ฐ„์˜ ๊ฐ„๊ฒฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํด๋ž˜์Šค๋Š”

  • Period
  • Duration

์ด ์žˆ๊ณ , ๊ฐ ํด๋ž˜์Šค๋Š” TemporalAmount ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.


8. ์‹œ๊ฐ„์˜ ๋‹จ์œ„์™€ ์‹œ๊ฐ„ ํ•„๋“œ

์‹œ๊ฐ„์˜ ๋‹จ์œ„ - ChronoUnit

  • ์œ„์™€ ๊ฐ™์ด ์‹œ๊ฐ„ ๋‹จ์œ„ / ๋‚ ์งœ ๋‹จ์œ„ / ๊ธฐํƒ€ ๋‹จ์œ„ ๋ณ„๋กœ ๋‹ค์–‘ํ•œ ChronoUnit ์„ ๊ฐ€์ง„๋‹ค.
  • TemporalUnit ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค
LocalTime lt1 = LocalTime.of(1, 10, 0);
LocalTime lt2 = LocalTime.of(1, 20, 0);

long secondsBetween = ChronoUnit.SECONDS.between(lt1, lt2);
System.out.println("secondsBetween = " + secondsBetween);
  • ๋‘ ๋‚ ์งœ / ์‹œ๊ฐ„ ์ฐจ์ด๋ฅผ ์›ํ•˜๋Š” ๋‹จ์œ„๋กœ ์‰ฝ๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค

 

์‹œ๊ฐ„ ํ•„๋“œ- ChronoField

  • ๋‚ ์งœ์™€ ์‹œ๊ฐ„์˜ ํŠน์ • ๋ถ€๋ถ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์—ด๊ฑฐํ˜•
  • ๋‚ ์งœ์™€ ์‹œ๊ฐ„์˜ ๊ฐ ํ•„๋“œ ์ค‘์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค
LocalDateTime dt = LocalDateTime.of(2030, 1, 1, 13, 30, 59);
System.out.println("YEAR = " + dt.get(ChronoField.YEAR));
System.out.println("YEAR = " + dt.getYear());

LocalDateTime changedDt1 = dt.with(ChronoField.YEAR, 2020);
LocalDateTime changedDt2 = dt.withYear(2020);

LocalDateTime with = dt.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));

9. ๋ฌธ์ž์—ด ํŒŒ์‹ฑ๊ณผ ํฌ๋งทํŒ…

ํฌ๋งทํŒ… : ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ํฌ๋งท์˜ ๋ฌธ์ž์—ด๋กœ ๋ณ€๊ฒฝ (DateString)

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy๋…„ MM์›” dd์ผ");
String formattedDate = date.format(formatter);
System.out.println("๋‚ ์งœ์™€ ์‹œ๊ฐ„ ํฌ๋งทํŒ… = " + formattedDate);

 

 

ํŒŒ์‹ฑ : ๋ฌธ์ž์—ด์„ ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€๊ฒฝ (String→ Date)

String input = "2030๋…„ 01์›” 01์ผ";
LocalDate parseDate = LocalDate.parse(input, formatter);
System.out.println("๋ฌธ์ž์—ด ํŒŒ์‹ฑ ๋‚ ์งœ์™€ ์‹œ๊ฐ„: " + parseDate);