Date/Time

์ƒˆ๋กœ ์ถ”๊ฐ€ ๋œ ์ด์œ 

1. java.util.Date ํด๋ž˜์Šค๋Š” mutableํ•˜์—ฌ thread safe ํ•˜์ง€ ์•Š๋‹ค.

Date date = new Date();
long time = date.getTime();
System.out.println(date); //Tue Nov 02 17:34:03 KST 2021

Thread.sleep();
Date date2 = new Date();
System.out.println(date2); //Tue Nov 02 17:34:06 KST 2021
date2.setTime(time); 
System.out.println(date2); //Tue Nov 02 17:34:03 KST 2021

Date๊ฐ์ฒด๋ฅผ ๋ณด๋ฉด setTime()๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋กœ ๋‚ด๋ถ€๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” mutableํ•˜์—ฌ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค.

  1. ํด๋ž˜์Šค ์ด๋ฆ„์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š๋‹ค. (Date์ธ๋ฐ ์‹œ๊ฐ„๊นŒ์ง€ ๋‹ค๋ฃฌ๋‹ค.) Date ๋ผ๋Š” ํด๋ž˜์Šค์ธ๋ฐ getTime()๊ณผ ๊ฐ™์ด ์‹œ๊ฐ„๊นŒ์ง€ ๋‹ค๋ฃฌ๋‹ค.

  2. ํƒ€์ž… ์•ˆ์ •์„ฑ์ด ์—†๊ณ  ์›”์ด 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ๋“ฑ๋“ฑ ๋ฒ„๊ทธ ๋ฐœ์ƒ์˜ ์—ฌ์ง€๊ฐ€ ๋งŽ๋‹ค.

Date date = new Date(-10000,1,1,1,1);
System.out.println(date); //Thu Feb 01 01:01:00 KST 8101

//Date
 public Date(int year, int month, int date, int hrs, int min) {
        this(year, month, date, hrs, min, 0);
}

ํƒ€์ž…์„ int๋กœ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์ˆซ์ž๋ฉด ๋ชจ๋‘ ๋‹ค ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์ด์ƒํ•œ ๊ฐ’์ด ์˜ฌ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

ํŠน์ง•

๊ธฐ์กด API

  • java.util.Date

  • java.util.Calendar

  • java.text.SimpleDateFormat

์ถ”๊ฐ€๋œ API

  • java.time.Instant : ๊ธฐ๊ณ„์‹œ๊ฐ„

  • java.time.LocalDate : ๋‚ ์งœ(์‹œ๊ฐ„x), ํƒ€์ž„์กดx

  • java.time.LocalTime : ์‹œ๊ฐ„(๋‚ ์งœx), ํƒ€์ž„์กดx

  • java.time.LocalDateTime : ๋‚ ์งœ/์‹œ๊ฐ„, ํƒ€์ž„์กดx

  • java.time.ZonedDateTime : ๋‚ ์งœ/์‹œ๊ฐ„, ํƒ€์ž„์กดo

  • java.time.DateTimeFormatter

  • java.time.Duration

  • java.time.Period

  • java.time.TemporalAdjuster

์‚ฌ์šฉ ์˜ˆ

1. Instant

Instant instant = Instant.now();
System.out.println(instant); //2021-11-02T14:07:19.218304100Z  (๊ธฐ์ค€์‹œ UTC ๊ธฐ์ค€)

ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
System.out.println(instant); //2021-11-02T23:08:45.188601700+09:00[Asia/Seoul]  (ํ˜„์žฌ KTC ๊ธฐ์ค€)

2. LocalDate/LocalTime/LocalDateTime/ZonedDateTime

LocalDateTime now = LocalDateTime.now();    //์„œ๋ฒ„์˜ ์‹œ์Šคํ…œ zone ๊ธฐ์ค€
System.out.println(now);

LocalDateTime of = LocalDateTime.of(1982, Month.JULU, 15,0,0,0);

ZonedDateTime nowInKorea = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
System.out.println(nowInKorea); 

3. DateTimeFormatter

//formatting
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;
System.out.println(now.format(formatter));      //2021-11-02T23:28:51.388655
formatter = DateTimeFormatter.ofPattern("MM.dd.yyyy");
System.out.println(now.format(formatter));      //11.02.2021

//parsing
LocalDate parse = LocalDate.parse("08.12.2021",formatter);
System.out.println(parse);

DateTimeFormatter์€ ofPattern()์„ ์ด์šฉํ•ด ํŠน์ • ํŒจํ„ด์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ฏธ๋ฆฌ ์ •์˜๋œ ํฌ๋งทํ„ฐ๋“ค์ด ์กด์žฌํ•˜๋Š”๋ฐ ์ด ํ˜•์‹์„ ์ด์šฉํ•˜๊ณ ์žํ•˜๋ฉด ๊ตณ์ด ์ƒˆ๋กœ ์ •์˜ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ •์˜๋œ ํฌ๋งทํ„ฐ๋“ค์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ 

๋˜ Date/Timeํƒ€์ž…์˜ parse()๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ํŠน์ • ๋ฌธ์ž์—ด์„ Date/Time ํƒ€์ž…์œผ๋กœ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

4. Duration / Period

//Period
LocalDate today = LocalDate.now();
LocalDate thisYearBirthDay = LocalDate.of(2022, Month.FEBRUARY,7);

Period period = Period.between(today, thisYearBirthDay);
System.out.println("์ƒ์ผ๊นŒ์ง€ ๋‚จ์€ ๊ธฐ๊ฐ„ : " + period.getYears() + " ๋…„ " + period.getMonths() + "์›” " + period.getDays() + "์ผ" );  //์ƒ์ผ๊นŒ์ง€ ๋‚จ์€ ๊ธฐ๊ฐ„ : 0 ๋…„ 3์›” 5์ผ

Period p = today.until(thisYearBirthDay);
System.out.println("์ƒ์ผ๊นŒ์ง€ ๋‚จ์€ ๊ธฐ๊ฐ„ : " + p.getYears() + " ๋…„ " + p.getMonths() + "์›” " + p.getDays() + "์ผ" );  //์ƒ์ผ๊นŒ์ง€ ๋‚จ์€ ๊ธฐ๊ฐ„ : 0 ๋…„ 3์›” 5์ผ

//Duration
Instant now = Instant.now();
Instant plus = now.plus(10,ChronoUnit.SECONDS);
Duration between = Duration.between(now,plus);
System.out.println(between.getSeconds());   //10

Period๋Š” ์‚ฌ๋žŒ์ด ์‚ฌ์šฉํ•˜๋Š” ๋‚ ์งœ/์‹œ๊ฐ„์˜ ๊ธฐ๊ฐ„์„ ์ธก์ •, Duration์€ ์ดˆ๋‹จ์œ„(๋‚˜๋…ธ,๋ฐ€๋ฆฌ)๋กœ ๋ฐ˜ํ™˜์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋กœ ๊ธฐ๊ณ„์šฉ ์‹œ๊ฐ„๊ฐ„์˜ ๊ธฐ๊ฐ„์„ ์ธก์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ถ”๊ฐ€

Immutable ํ•œ Date/Time

LocalDateTime now = LocalDateTime.now();
Lonow = now.plusDays(1);


//LocalDateTime์˜ plusDays() ๋ฉ”์„œ๋“œ
public LocalDateTime plusDays(long days) {
    LocalDate newDate = date.plusDays(days);
    return with(newDate, time);
}

private LocalDateTime with(LocalDate newDate, LocalTime newTime) {
    if (date == newDate && time == newTime) {
            return this;
    }
    return new LocalDateTime(newDate, newTime);
}

Date/Time์˜ ๋ชจ๋“  ๊ฐ์ฒด๋Š” mutableํ•œ ์†์„ฑ์˜ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•˜๊ณ ์ž Immutableํ•œ ์†์„ฑ์„ ๊ฐ–๊ณ  ์„ค๊ณ„๊ฐ€ ๋˜์—ˆ๋Š”๋ฐ ์ด ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ๋‚ ์งœ,์‹œ๊ฐ„์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์œ„์— ์ •์˜๋œ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ๋‹ค.


Reference

https://codeblog.jonskeet.uk/2017/04/23/all-about-java-util-date/

Last updated