์ž๋ฐ”์˜ ์ •์„ - ๋‚ ์งœ์™€ ์‹œ๊ฐ„(Calendar์™€ Date, java.timeํŒจํ‚ค์ง€)

๋ธ”๋กœ๊ทธ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค! ๐Ÿก’ integer.blog



์ž๋ฐ”์˜ ์ •์„(๋‚จ๊ถ์„ฑ ์ €) ํ•™์Šต๋‚ด์šฉ ์ •๋ฆฌ

1. Calendar ์™€ Date

  • Date๋Š” JDK1.0, Calendar๋Š” JDK1.1 ๋ถ€ํ„ฐ ์ œ๊ณต๋˜์—ˆ๋‹ค.
  • JDK1.8๋ถ€ํ„ฐ java.time ํŒจํ‚ค์ง€๋กœ Calendar์™€ Date์˜ ๋‹จ์ ์„ ๊ฐœ์„ ํ•œ ํด๋ž˜์Šค๋“ค์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
  • Calendar๋Š” ์ถ”์ƒํด๋ž˜์Šค๋ผ์„œ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๊ณ , ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ์™„์ „ํžˆ ๊ตฌํ˜„๋œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป์–ด์•ผ ํ•œ๋‹ค.
    // ์—๋Ÿฌ. ์ถ”์ƒํด๋ž˜์Šค๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค.
    Calendar cal = new Calendar(); 
    
    // ๊ตฟ. getInstance()๋Š” Calendar ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜
    Calendar cal = Calendar.getInstance();
  • getInstance()๊ฐ€ static์ธ ์ด์œ 
    • ๋ฉ”์†Œ๋“œ ๋‚ด์˜ ์ฝ”๋“œ์—์„œ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ
    • static์ด ์•„๋‹ˆ๋ผ๋ฉด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ์— ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š”๋ฐ Calendar๋Š” ์ถ”์ƒํด๋ž˜์Šค๋ผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ

1.1. Calendar ์™€ Date ๊ฐ„ ๋ณ€ํ™˜

  • Calendar๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด์„œ Date๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ deprecated ๋˜์—ˆ๋‹ค.
  • Java API ๋ฌธ์„œ์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š” ๋Œ€์ƒ์— deprecated๋ฅผ ๋ถ™์˜€๋‹ค.
    //1. Calendar๋ฅผ Date๋กœ ๋ณ€ํ™˜
        Calendar cal = Calendar.getInstance();
          ...
        Date d = new Date(cal.getTimeInMillis());
    
    //2. Date๋ฅผ Calendar๋กœ ๋ณ€ํ™˜
        Date d = new Date();
          ...
        Calendar cal = Calendar.getInstance();
        cal.setTime(d);
  • get(Calendar.MONTH)๋กœ ์–ป์–ด์˜ค๋Š” ๊ฐ’์€ 1~12๊ฐ€ ์•„๋‹ˆ๋ผ 0~11์ด๋‹ค. ๊ทธ๋ž˜์„œ 0์ด 1์›” 11์ด 12์›”์„ ์˜๋ฏธํ•œ๋‹ค.

1.2. ๋‘ ๋‚ ์งœ๊ฐ„์˜ ์ฐจ์ด ๊ตฌํ•˜๊ธฐ

  • ๋‘ ๋‚ ์งœ๋ฅผ ์ตœ์†Œ๋‹จ์œ„์ธ ์ดˆ๋‹จ์œ„๋กœ ๋ณ€๊ฒฝํ•œ ๋‹ค์Œ ๊ทธ ์ฐจ์ด๋ฅผ ๊ตฌํ•œ๋‹ค.

1.3. ์‹œ๊ฐ„์ƒ์˜ ์ „ํ›„ ์•Œ๊ธฐ

  • ๋‘ ๋‚ ์งœ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์–‘์ˆ˜์ธ์ง€ ์Œ์ˆ˜์ธ์ง€ ํŒ๋‹จ
  • boolean after(Object when) ๋˜๋Š” boolean before(Object when) ์‚ฌ์šฉ

1.4. ํŠน์ • ๋‚ ์งœ/์‹œ๊ฐ„ ๊ธฐ์ค€ ์ผ์ • ๊ธฐ๊ฐ„ ์ „ํ›„์˜ ๋‚ ์งœ/์‹œ๊ฐ„ ์•Œ๊ธฐ

  • add(int field, int amount)
  • roll(int field, int amount)
    • add()์™€์˜ ์ฐจ์ด์ ์€ ๋‹ค๋ฅธ ํ•„๋“œ์— ์˜ํ–ฅ ๋ฏธ์น˜์ง€ ์•Š์Œ
    • ๋‹จ, Calendar.DATE๊ฐ€ ๋ง์ผ์ผ ๋•Œ, roll๋กœ Calendar.MONTH๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด Calendar.DATE ํ•„๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค.

1.5. ํ•ด๋‹น ์›”์˜ ๋งˆ์ง€๋ง‰๋‚  ์•Œ๊ธฐ

  • ๋‹ค์Œ ๋‹ฌ์˜ 1์ผ์—์„œ ํ•˜๋ฃจ ๋นผ๊ธฐ
  • getActualMaximum(Calendar.DATE) ์‚ฌ์šฉ

1.6. ์ผ ์ˆ˜ ๊ณ„์‚ฐ

  • Calendar๋Š” 1970๋…„ 1์›” 1์ผ์„ ๊ธฐ์ค€์œผ๋กœ ๊ณ„์‚ฐ
  • 1970๋…„ 1์›” 1์ผ ์ด์ „์— ๋‚ ์งœ์— ๋Œ€ํ•ด getTimeInMillis()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์Œ์ˆ˜ ๋ฐ˜ํ™˜

2. ํ˜•์‹ํ™” ํด๋ž˜์Šค

2.1. DecimalFormat

  • DecimalFormat์„ ์ด์šฉํ•˜๋ฉด ์ˆซ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์ •์ˆ˜, ๋ถ€๋™์†Œ์ˆ˜์ , ๊ธˆ์•ก ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ํ˜•์‹์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ˜๋Œ€๋กœ ์ผ์ •ํ•œ ํ˜•์‹์˜ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆซ์ž๋กœ ์‰ฝ๊ฒŒ ๋ณ€ํ™˜
  • ํ˜•์‹ํ™” ํด๋ž˜์Šค๋Š” ํŒจํ„ด์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ „๋ถ€๋‹ค.
  • DecimalFormat ์‚ฌ์šฉ๋ฒ•
    double number = 1234567.89;
    
    // 1.์›ํ•˜๋Š” ์ถœ๋ ฅํ˜•์‹์˜ ํŒจํ„ด์„ ์ž‘์„ฑํ•˜์—ฌ DecimalFormat ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ
    DecimalFormat df = new DecimalFormat("#.#E0"); 
    
    // 2.์ถœ๋ ฅํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž์—ด๋กœ format ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ
    String result = df.format(number);

2.2. SimpleDateFormat

  • ๋‚ ์งœ ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋‹ค์–‘ํ•˜๊ฒŒ ์ถœ๋ ฅ
  • ์‚ฌ์šฉ๋ฐฉ๋ฒ•
    • ์›ํ•˜๋Š” ์ถœ๋ ฅ ํ˜•์‹์˜ ํŒจํ„ด์„ ์ž‘์„ฑํ•˜์—ฌ SimpleDateFormat ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ
    • ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•˜๋Š” Date ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  format(Date d)๋ฅผ ํ˜ธ์ถœ
      Date today = new Date();
      SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
      String result = df.format(today);
      //์˜ค๋Š˜ ๋‚ ์งœ๋ฅผ yyyy-MM-dd ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜
  • parse(String source)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ ์งœ ๋ฐ์ดํ„ฐ์˜ ์ถœ๋ ฅํ˜•์‹ ๋ณ€ํ™˜ ๊ฐ€๋Šฅ
  • SimpleDateFormat์˜ parse(String source)๋Š” ๋ฌธ์ž์—ด source๋ฅผ ๋‚ ์งœ Date ์ธ์Šคํ„ด์Šค๋กœ ๋ณ€ํ™˜ํ•ด์คŒ
    DateFormat df = new SimpleDateFormat("yyyy๋…„ MM์›” dd์ผ");
    DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");
    Date d = df.parse("2018๋…„ 10์›” 3์ผ");
    
    System.out.println(df2.format(d)); // 2018/10/03

2.3. ChoiceFormat

  • ChoiceFormat์€ ํŠน์ • ๋ฒ”์œ„์— ์†ํ•˜๋Š” ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜
  • ์—ฐ์†์ /๋ถˆ์—ฐ์†์ ์ธ ๋ฒ”์œ„์˜ ๊ฐ’ ์ฒ˜๋ฆฌ์— ์œ ์šฉ(์˜ˆ๋ฅผ ๋“ค์–ด 90์ ๊นŒ์ง€ A, 80์ ๊นŒ์ง€ B, ..)
  • ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ limit#value ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ
    • ๊ตฌ๋ถ„์ž๋กœ #๋Š” ๊ฒฝ๊ณ„๊ฐ’ ํฌํ•จ, <๋Š” ๋ฏธํฌํ•จ

3. java.time ํŒจํ‚ค์ง€

Java์˜ ํƒ„์ƒ๊ณผ ํ•จ๊ป˜ํ•œ Date์™€ Calendar์˜ ๋‹จ์ ์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด
JDK 1.8๋ถ€ํ„ฐ java.time ํŒจํ‚ค์ง€๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
์ด ํŒจํ‚ค์ง€๋Š” 4๊ฐœ์˜ ํ•˜์œ„ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋‹ค.

java.time - ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋‹ค๋ฃจ๋Š”๋ฐ ํ•„์š”ํ•œ ํ•ต์‹ฌ ํด๋ž˜์Šค๋“ค ์ œ๊ณต
java.time.chrono - ํ‘œ์ค€(ISO)์ด ์•„๋‹Œ ๋‹ฌ๋ ฅ ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ํด๋ž˜์Šค๋“ค ์ œ๊ณต
java.time.format - ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ํŒŒ์‹ฑ, ํ˜•์‹ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค๋“ค ์ œ๊ณต
java.time.temporal - ๋‚ ์งœ์™€ ์‹œ๊ฐ„์˜ ํ•„๋“œ์™€ ๋‹จ์œ„(unit)์„ ์œ„ํ•œ ํด๋ž˜์Šค๋“ค ์ œ๊ณต
java.time.zone - ์‹œ๊ฐ„๋Œ€(time-zone)์™€ ๊ด€๋ จ๋œ ํด๋ž˜์Šค๋“ค ์ œ๊ณต

3.1 Immutable & Thread-safe

์œ„ ํŒจํ‚ค์ง€์˜ ํด๋ž˜์Šค๋“ค์€ String ํด๋ž˜์Šค์ฒ˜๋Ÿผ Immutable์ด๋‹ค. ์ฆ‰, ๋‚ ์งœ๋‚˜ ์‹œ๊ฐ„์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ธฐ์กด์˜ ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
๊ธฐ์กด์˜ Calendar ํด๋ž˜์Šค๋Š” ๋ณ€๊ฒฝ๊ฐ€๋Šฅ ํ•˜๋ฏ€๋กœ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์•˜๋‹ค.

๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์„œ
๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜๋ชป ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.
์ด๋ฅผ ์“ฐ๋ ˆ๋“œ ์•ˆ์ „(Thread-safe)ํ•˜์ง€ ๋ชปํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.

3.2. java.time ํŒจํ‚ค์ง€์˜ ํ•ต์‹ฌ ํด๋ž˜์Šค

์‹œ๊ฐ„์„ ํ‘œํ˜„ํ•  ๋•Œ๋Š” LocalTime,
๋‚ ์งœ๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ๋Š” LocalDate,
๋ชจ๋‘ ํ‘œํ˜„ํ•  ๋•Œ๋Š” LocalDateTime,
์‹œ๊ฐ„๋Œ€(time-zone)๊นŒ์ง€ ํ‘œํ˜„ํ•˜๋ ค๋ฉด ZonedDateTime ์‚ฌ์šฉ

3.3. ํƒ€์ž„์Šคํƒฌํ”„(time-stamp)

๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ์ดˆ๋‹จ์œ„๋กœ ํ‘œํ˜„ํ•œ ๊ฐ’.
์ด ๊ฐ’์€ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ํ•˜๋‚˜์˜ ์ •์ˆ˜๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๊ฑฐ๋‚˜ ์ˆœ์„œ๋ฅผ ๋น„๊ตํ•˜๋Š”๋ฐ ์œ ๋ฆฌํ•˜๋‹ค. (๊ทธ๋ž˜์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋งŽ์ด ์‚ฌ์šฉ)

3.4. ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ

java.time ํŒจํ‚ค์ง€์— ์†ํ•œ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด ์ƒ์„ฑ์€ now()์™€ of()๋กœ ํ•œ๋‹ค.

  • now() ์˜ˆ์‹œ
    LocalDate date = LocalDate.now();
    LocalTime time = LocalTime.now();
  • of() ์˜ˆ์‹œ
    LocalDate date = LocalDate.of(2010, 10, 04); // 2010๋…„ 10์›” 4์ผ(๊ตฐ์ž…๋Œ€ใ…‹)
    LocalTime time = LocalTime.of(23, 59, 59); // 23์‹œ 59๋ถ„ 59์ดˆ

3.5. ํ•„๋“œ ๊ฐ’ ๋ณ€๊ฒฝํ•˜๊ธฐ

๋‚ ์งœ์™€ ์‹œ๊ฐ„์—์„œ ํŠน์ • ํ•„๋“œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด with๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ

  • ์ข…๋ฅ˜
    LocalDate withYear(int year)  
    LocalDate withMonth(int month)  
    LocalDate withDayOfMonth(int dayOfMonth)  
    LocalDate withDayOfYear(int dayOfYear)  
    
    LocalTime withHour(int hour)  
    LocalTime withMinute(int minute)  
    LocalTime withSecond(int second)  
    LocalTime withNano(int nanoOfSecond)
  • with() ์‚ฌ์šฉ์‹œ ์›ํ•˜๋Š” ํ•„๋“œ๋ฅผ ์ง์ ‘ ์ง€์ • ๊ฐ€๋Šฅ
    LocalDate with(TemporalField field, long newValue)
  • ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋“ค์€ ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ๋Œ€์ž…์—ฐ์‚ฐ์ž๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
    date = date.withYear(2018); // ๋…„๋„๋ฅผ 2018๋…„์œผ๋กœ ๋ณ€๊ฒฝ
    time = time.withHour(12); // ์‹œ๊ฐ„์„ 12์‹œ๋กœ ๋ณ€๊ฒฝ
  • LocalTime์˜ truncatedTo()๋Š” ์ง€์ •๋œ ๊ฒƒ๋ณด๋‹ค ์ž‘์€ ๋‹จ์œ„์˜ ํ•„๋“œ๋ฅผ 0์œผ๋กœ ๋งŒ๋“ ๋‹ค.
    LocalTime time = LocalTime.of(12, 34, 56); // 12์‹œ 34๋ถ„ 56์ดˆ
    time = time.truncatedTo(ChronoUnit.HOURS); // ์‹œ(hour)๋ณด๋‹ค ์ž‘์€ ๋‹จ์œ„๋ฅผ 0
    System.out.println(time); // 12:00

3.6. ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๋น„๊ต

  • compareTo()
    int result = date1.compareTo(date2);
    // ๊ฐ™์œผ๋ฉด 0, date1์ด ์ด์ „์ด๋ฉด -1, ์ดํ›„๋ฉด 1
  • booleanํ˜• ๋ฉ”์†Œ๋“œ๋“ค
    boolean isAfter (ChronoLocalDate other)
    boolean isBefore (ChronoLocalDate other)
    boolean isEqual (ChronoLocalDate other)

3.7. LocalDateTime

  • LocalDate์™€ LocalTime์„ ํ•ฉ์ณ์„œ LocalDateTime์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

    LocalDate date = LocalDate.of(2018, 10, 05);
    LocalTime time = LocalTime.of(12,34,56);
    
    LocalDateTime dt = LocalDateTime.of(date, time);
    LocalDateTime dt2 = date.atTime(time);
    LocalDateTime dt3 = time.atDate(date);
    LocalDateTime dt4 = date.atTime(12, 34 ,56);
    LocalDateTime dt5 = time.atDate(LocalDate.of(2018, 10, 05));
    LocalDateTime dt6 = date.atStartOfDay(); // = date.atTime(0,0,0);
    
    LocalDateTime dateTime = LocalDateTime.of(2018, 10, 05, 12, 34, 56);
    LocalDateTime today = LocalDateTime.now();
  • ๋ฐ˜๋Œ€๋กœ LocalDateTime์„ LocalDate ๋˜๋Š” LocalTime์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

    LocalDateTime dt = LocalDateTime.of(2018, 10, 05, 12, 34, 56);
    LocalDate date = dt.toLocalDate();
    LocalTime time = dt.toLocalTime();

3.8. ZonedDateTime

LocalDateTime์— ํƒ€์ž„์กด(tiem-zone)์„ ์ถ”๊ฐ€ํ•˜๋ฉด ZonedDateTime์ด ๋œ๋‹ค.
ZoneId๋Š” ์ผ๊ด‘ ์ ˆ์•ฝ์‹œ๊ฐ„(DST, Daylight Saving Time)์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.
LocalDateTime์— atZone()์œผ๋กœ ์‹œ๊ฐ„๋Œ€ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, ZonedDateTime์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

ZoneId zid = ZoneId.of("Asia/Seoul");
ZonedDateTime zdt = dateTime.atZone(zid);

ํŠน์ • ํƒ€์ž„์กด์˜ ์‹œ๊ฐ„ ์•Œ๊ธฐ

ZoneId nyId = ZoneId.of("America/New_York");
ZonedDateTime nyTime = ZonedDateTime.now().withZoneSameInstant(nyId);
// now() ๋Œ€์‹  of() ์‚ฌ์šฉํ•˜์—ฌ ๋‚ ์งœ&์‹œ๊ฐ„ ์ง€์ • ๊ฐ€๋Šฅ

UTC๋กœ๋ถ€ํ„ฐ ์–ผ๋งˆ๋‚˜ ๋–จ์–ด์ ธ์žˆ๋Š”์ง€๋ฅผ ZoneOffSet์œผ๋กœ ํ‘œํ˜„

3.9. OffsetDateTime

ZonedDateTime์€ ZoneId๋กœ ๊ตฌ์—ญ์„ ํ‘œํ˜„ํ•˜๋Š”๋ฐ,
ZoneOffset์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด OffsetDateTime ์ด๋‹ค.
ZoneId๋Š” ์ผ๊ด‘์ ˆ์•ฝ์‹œ๊ฐ„ ์ฒ˜๋Ÿผ ํƒ€์ž„์กด๊ณผ ๊ด€๋ จ๋œ ๊ทœ์น™๋“ค์„ ํฌํ•จํ•˜์ง€๋งŒ,
ZoneOffset์€ ๋‹จ์ง€ ์‹œ๊ฐ„๋Œ€๋ฅผ ์‹œ๊ฐ„์˜ ์ฐจ์ด๋กœ๋งŒ ๊ตฌ๋ถ„

3.10. Period์™€ Duration

๋‘ ๋‚ ์งœ์˜ ์ฐจ์ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Period๋Š” between()์œผ๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

LocalDate date1 = LocalDate.of(2017, 1, 16); // ์ฒซ ์ง์žฅ ์ž…์‚ฌ์ผใ…‹ใ…‹
LocalDate date2 = LocalDate.of(2018, 6, 4); // ๋‘๋ฒˆ์งธ ์ง์žฅ ์ž…์‚ฌ์ผ

Period pe = Period.between(date1, date2);
// date1์ด date2๋ณด๋‹ค ์ด์ „์ด๋ฉด ์–‘์ˆ˜, ์ดํ›„๋ฉด ์Œ์ˆ˜๋กœ Period์— ์ €์žฅ

until() ์€ between()๊ณผ ๊ฐ™์€ ์—ญํ• ์ด์ง€๋งŒ,
between()์€ static ๋ฉ”์†Œ๋“œ์ด๊ณ , until()์€ ์ธ์Šคํ„ด์Šค ๋ฉ”์†Œ๋“œ์ด๋‹ค.
D-day๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ, ๋‘ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋Š” until()์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค.

long sec = LocalTime.now().until(endTime, ChronoUnit.SECONDS);

LocalDate์˜ toEpochDay() ๋Š” Epoch Day์ธ 1970-01-01๋ถ€ํ„ฐ ๋‚ ์งœ๋ฅผ ์„ธ์–ด์„œ ๋ฐ˜ํ™˜.
Period๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‘ ๋‚ ์งœ ์‚ฌ์ด์˜ ์ผ ์ˆ˜๋ฅผ ํŽธํ•˜๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

LocalDate date1 = LocalDate.of(2010, 08, 20); // ์‚ฌ๊ท€๊ธฐ ์‹œ์ž‘ํ•œ ๋‚ 
LocalDate date2 = LocalDate.of(2017, 11, 25); // ๊ฒฐํ˜ผํ•œ ๋‚ ใ…Ž

long ์—ฐ์• ๊ธฐ๊ฐ„ = date2.toEpochDay() - date1.toEpochDay();

3.11. ์ถœ๋ ฅํ˜•์‹ ์ •์˜

DateTimeFormatter์˜ ofPattern()์œผ๋กœ ์›ํ•˜๋Š” ์ถœ๋ ฅํ˜•์‹์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");