1. ๋ ์ง์ ์๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํ ์ด์
1) ๋ ์ง์ ์๊ฐ ์ฐจ์ด ๊ณ์ฐ
- ํน์ ๋ ์ง์์ ๋ค๋ฅธ ๋ ์ง๊น์ง์ ์ ํํ ์ผ์๋ฅผ ๊ณ์ฐํ๋๊ฑด ๋ณต์กํ๋ค (์ค๋ , ์ผ์ ๋ฑ์ ๊ณ ๋ คํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋จ์ ๋ง์ , ๋บ์ ์ฐ์ฐ์ผ๋ก๋ ์ ํํ ๊ฒฐ๊ณผ ์ป๊ธฐ ํจ๋ค๋ค)
- ์ค๋ ์ด์ธ์๋ ์ผ๊ด ์ ์ ์๊ฐ ๋ณํ, ํ์์กด ๊ณ์ฐ ๋ฑ ๋ณต์กํ ๊ณ์ฐ์ด ํ์ํ ํญ๋ชฉ์ด ๋ง๋ค.
- ์ด๋ฌํ ๊ณ์ฐ์ ๊ณ์ฐํ๊ธฐ ์ํด ์๋ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ด๋ฅผ ๊ณ์ฐํ ์ ์๋ค.
2. ์๋ฐ ๋ ์ง์ ์๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ญ์ฌ
1) JDK 1.0 (java.util.Date)
* ๋ฌธ์ ์
- ํ์์กด ์ฒ๋ฆฌ ๋ถ์กฑ
- ๋ถํธํ ๋ ์ง ์๊ฐ ์ฐ์ฐ
- ๋ถ๋ณ ๊ฐ์ฒด ๋ถ์ฌ
2) JAVA 1.1 (java.util.Calendar)
* ๋ฌธ์ ์
- ์ฌ์ฉ์ฑ ์ ํ
- ์ฑ๋ฅ ๋ฌธ์
- ๋ถ๋ณ ๊ฐ์ฒด ๋ถ์ฌ
3) JDK 1.8 (java.time ํจํค์ง)
- ์ด์ ์ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ํฌ๊ฒ ๊ฐ์ ๋์๋ค.
- ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๋ถ๋ณ ๊ฐ์ฒด ์ค๊ณ๋ก ์ฌ์ด๋ ์ดํํธ, ์ค๋ ๋ ์์ ์ฑ ๋ณด์ฅ, ๋ณด๋ค ์ง๊ด์ ์ธ API ์ ๊ณต์ผ๋ก ๋ ์ง์ ์๊ฐ ์ฐ์ฐ์ ๋จ์ํ ํ๋ค.
- LocalDate, LocalTime, LocalDateTime, ZoneDateTime, Instant ๋ฑ์ ํด๋์ค๋ฅผ ํฌํจํ๋ค.
3. ์๋ฐ ๋ ์ง์ ์๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๊ฐ
- ์๋ฐ ๋ ์ง์ ์๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ ํ ํ๋๋ก ์ ๋ฆฌํ ์ ์๋ค.
- ์ฐธ๊ณ : https://docs.oracle.com/javase/tutorial/datetime/iso/overview.html
- * : ์ด๋ ๋๋ ธ์ด ์ด ๋จ์์ ์ ๋ฐ๋๋ก ์บก์ณ๋๋ค.
- ** : ์ด ํด๋์ค๋ ์ด ์ ๋ณด๋ฅผ ์ ์ฅํ์ง๋ ์์ง๋ง, ์ด๋ฌํ ๋จ์๋ก ์๊ฐ์ ์ ๊ณตํ๋ ๋ฉ์๋๊ฐ ์๋ค.
- *** : zoneDateTime์ Period๋ฅผ ์ถ๊ฐํ๋ฉด ์๋จธํ์ ๋๋ ๊ธฐํ ํ์ง ์๊ฐ ์ฐจ์ด๋ฅผ ์ค์ํ๋ค.
1) LocalDate, LocalTime, LocalDateTime
- LocalDate : ๋ ์ง๋ง์ ํํ
- LocalTime : ์๊ฐ๋ง์ ํํ
- LocalDateTime : ๋ ์ง์ ์๊ฐ์ ํํ (LocalDate + LocalTime ๊ฐ๋ )
- Local์ด ๋ถ๋ ์ด์ ๋ ์ธ๊ณ ์๊ฐ๋๋ฅผ ๊ณ ๋ คํ์ง ์์ ํ์์กด์ด ์ ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. (ํน์ ์ง์ญ์ ๋ ์ง์ ์๊ฐ๋ง์ ๊ณ ๋ ค)
2) ZonedDateTime, OffsetDateTime
- ZonedDateTime : ์๊ฐ๋๋ฅผ ๊ณ ๋ คํ ๋ ์ง์ ์๊ฐ์ ํํํ ๋ ์ฌ์ฉ (์๊ฐ๋๋ฅผ ํํํ๋ ํ์์กด์ด ํฌํจ๋จ)
- OffsetDateTime : ์๊ฐ๋๋ฅผ ๊ณ ๋ คํ ๋ ์ง์ ์๊ฐ์ ํํํ ๋ ์ฌ์ฉ (ํ์์กด์ด ์๊ณ , UTC๋ก ๋ถํฐ ์๊ฐ๋ ์ฐจ์ด๋ง ๋ณด์ฌ์ค)
3) Instant
- UTC๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ ์๊ฐ์ ํ ์ง์ ์ ๋ํ๋ธ๋ค. (1970๋ 1์ 1์ผ 0์ 0๋ถ 0์ด(UTC)๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๊ณผํ ์๊ฐ์ผ๋ก ๊ณ์ฐ)
- Instant ๋ด๋ถ์๋ ์ด ๋ฐ์ดํฐ๋ง ๋ค์ด์๋ค.(๋๋ ธ์ด ํฌํจ)
4) Period, Duration
* ์๊ฐ์ ๊ฐ๋ ์ ํฌ๊ฒ 2๊ฐ์ง๋ก ํํ๋๋ค.
- ํน์ ์์ ์ ์๊ฐ(์๊ฐ)
- ์๊ฐ์ ๊ฐ๊ฒฉ(๊ธฐ๊ฐ)
- Perion, Duration์ ์๊ฐ์ ๊ฐ๊ฒฉ์ ํํํ๋๋ฐ ์ฌ์ฉ๋๋ค.
- Period : ๋ ๋ ์ง ์ฌ์ด์ ๊ฐ๊ฒฉ์ ๋ , ์, ์ผ ๋จ์๋ก ๋ํ๋ธ๋ค.
- Duration : ๋ ์๊ฐ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์, ๋ถ, ์ด(๋๋ ธ์ด) ๋จ์๋ก ๋ํ๋ธ๋ค.
3. ๊ธฐ๋ณธ ๋ ์ง์ ์๊ฐ - LocalDateTime
- ๋ชจ๋ ๋ ์ง ํด๋์ค๋ ๋ถ๋ณ์ด๋ฏ๋ก ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ฐํ๊ฐ์ ๊ผญ ๋ฐ์์ผ ํ๋ค.
1) LocalDateTime
- LocalDateTime์ LocalDate์ LocalTime์ ๋ด๋ถ์ ๊ฐ์ง๊ณ ๋ ์ง์ ์๊ฐ ๋ชจ๋ ํํํ๋ค.
//LocalDateTime ํด๋์ค ๊ตฌ์กฐ
public class LocalDateTime {
private final LocalDate date;
private final LocalTime time;
...
}
- now() : ํ์ฌ ๋ ์ง์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์์ฑ
- of(...) : ํน์ ๋ ์ง์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์์ฑ ( ๋ , ์, ์ผ ์ ๋ ฅ๊ฐ๋ฅ)
- ๋ ์ง์ ์๊ฐ์ toLocalDate(), toLocalTime() ๋ฉ์๋๋ก ๋ถ๋ฆฌ ๊ฐ๋ฅ
- LocalDateTime.of(localDate, localTime) ์ผ๋ก ํฉ์ณ์ LocalDatetime์ ๋ง๋ค ์ ์๋ค.
- PlusXxx() : ํน์ ๋ ์ง ๋ฐ ์๊ฐ์ ๋ํ๋ค.
- isBefore() / isAfter() : ๋ค๋ฅธ ๋ ์ง์๊ฐ๊ณผ ๋น๊ต
- isEquals() : ๋ค๋ฅธ ๋ ์ง์๊ฐ๊ณผ ์๊ฐ์ ์ผ๋ก ๋์ผํ์ง ๋น๊ต
- isEquals()๋ ๋จ์ํ ๋น๊ต ๋์์ด ์๊ฐ์ ์ผ๋ก ๊ฐ๋ค๋ฉด true๋ก ๋ฐํํ๋ค ( ๊ฐ์ฒด๊ฐ ๋ค๋ฅด๊ณ ํ์์กด์ด ๋ฌ๋ผ๋ ์๊ฐ์ ์ผ๋ก ๊ฐ์ผ๋ฉด true ๋ฐํ)
- equals()๋ ๊ฐ์ฒด์ ํ์ , ํ์์กด ๋ฑ ๋ด๋ถ์ ๊ตฌ์ฑ์์ ๋ชจ๋๊ฐ ๊ฐ์์ผ true๋ฅผ ๋ฐํ
4. ํ์์กด - ZonedDateTime
- Asia/Seoul๊ณผ ๊ฐ์ ํ์์กด ์์๋ ์ผ๊ด ์ ์ ์๊ฐ์ ์ ๋ํ ์ ๋ณด์ UTC+9:00๊ณผ ๊ฐ์ ์คํ์ ์ ๋ณด๋ฅผ ๋ชจ๋ ํฌํจํ๊ณ ์๋ค.
- ์๋ฐ์์๋ ์ด ํ์์กด์ ZoneId๋ก ๊ด๋ฆฌํ๋ค.
- ZoneId.systemDefault() : ์์คํ ์์ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ZoneId๋ฅผ ๋ฐํํ๋ค.
- ZoneId.of() : ํ์์กด์ ์ง์ ์ ๊ณตํด์ ZoneId๋ฅผ ๋ฐํํ๋ค.
1) ZoneDateTime
- ZoneDateTime : LocalDateTime์ ์๊ฐ๋ ์ ๋ณด์ธ ZoneId๊ฐ ํฉ์ณ์ง ๊ฒ
//ZonedDateTime ํด๋์ค ๊ตฌ์กฐ
pulic class ZonedDateTime {
private final LocalDateTime dateTime;
private final ZoneOffset offset;
private final ZoneId zone;
}
- ์๊ฐ๋๋ฅผ ๊ณ ๋ คํ ๋ ์ง์ ์ฌ๊ธด์ ํํํ ๋ ์ฌ์ฉํ๋ค. (์๊ฐ๋๋ฅผ ํํํ๋ ํ์์กด์ด ํฌํจ๋จ)
2) OffsetDateTime
- OffsetDateTime์ LocalDateTime์ UTC ์คํ์ ์ ๋ณด์ธ ZoneOffset์ด ํฉ์ณ์ง ๊ฒ์ด๋ค.
//OffsetDateTime ํด๋์ค ๊ตฌ์กฐ
public class OffsetDateTime {
private final LocalDateTime dateTime;
private final ZoneOffset offset;
}
- ์๊ฐ๋๋ฅผ ๊ณ ๋ คํ ๋ ์ง์ ์๊ฐ์ ํํํ ๋ ์ฌ์ฉ๋๋ฉฐ, ํ์์กด์ด ์๋ค.
5. ๊ธฐ๊ณ ์ค์ฌ์ ์๊ฐ - Instant
- ์์ ์ธ๊ธํ์ง๋ง, Instant๋
- UTC๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ ์๊ฐ์ ํ ์ง์ ์ ๋ํ๋ธ๋ค. (1970๋ 1์ 1์ผ 0์ 0๋ถ 0์ด(UTC)๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๊ณผํ ์๊ฐ์ผ๋ก ๊ณ์ฐ)
- Instant ๋ด๋ถ์๋ ์ด ๋ฐ์ดํฐ๋ง ๋ค์ด์๋ค.(๋๋ ธ์ด ํฌํจ)
- Epoch ์๊ฐ์ ๋ค๋ฃจ๋ ํด๋์ค(์๊ฐ๋์ ์ํฅ์ ๋ฐ์ง ์๋ ์ ๋์ ์ธ ์๊ฐ ํํ ๋ฐฉ์)
//Instant ํด๋์ค ๊ตฌ์กฐ
public class Instant {
private final long second;
private final int nonos;
...
}
1) Instant ํน์ง
* ์ฅ์
- ์๊ฐ๋ ๋ ๋ฆฝ์ฑ : UTC์ ํน์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ํ๋ฏ๋ก ์ ์ธ๊ณ ์ด๋์๋ ๋์ผํ ์์ ์ ๊ฐ๋ฆฌํค๋๋ฐ ์ ์ฉํ๋ค.
- ๊ณ ์ ๋ ๊ธฐ์ค์ : Instant๋ 1970๋ 1์ 1์ผ UTC๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ ๊ณ์ฐ ๋ฐ ๋น๊ต๊ฐ ๋ช ํํ๊ณ ์ผ๊ด๋๋ค.
* ๋จ์
- ์ฌ์ฉ์ ์นํ์ ์ด์ง ์์ : ๊ธฐ๊ณ์ ์ธ ์๊ฐ ์ฒ๋ฆฌ์๋ ์ ํฉํ์ง๋ง ์ฌ๋์ด ์ฝ๊ธฐ์๋ ์ง๊ด์ ์ด์ง ์๋ค.
- ์๊ฐ๋ ์ ๋ณด ๋ถ์ฌ : ์๊ฐ๋ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ง ์์ ๋ณํํ๋ ค๋ฉด ์ถ๊ฐ์ ์ธ ์์ ์ด ํ์ํ๋ค.
* ์ฌ์ฉ ์
- ์ ์ธ๊ณ์ ์ธ ์๊ฐ ๊ธฐ์ค ํ์ ์
- ์๊ฐ๋ ๋ณํ ์์ด ๊ณ์ฐ ํ์ ์
- ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ๊ตํ
- ์ผ๋ฐ์ ์ผ๋ก ๋ ์ง์ ์๊ฐ์ ์ฌ์ฉํ ๋๋ localDateTime, zonedDateTime์ ์ฌ์ฉํ๊ณ , Instant๋ ํน๋ณํ ๊ฒฝ์ฐ๋ง ์ฌ์ฉ
- now() : UTC๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ฌ ์๊ฐ์ Instant ์์ฑ
- from() : ๋ค๋ฅธ ํ์ ์ ๋ ์ง์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก Instant๋ฅผ ์์ฑํ๋ค.
- OfEpochSecond() : ์ํฌํฌ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก Instant๋ฅผ ์์ฑํ๋ค.
- plusSeconds() : ์ด๋ฅผ ๋ํ๋ค
- getEpochSecond() : ์ํฌํฌ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ํ๋ฅธ ์ด๋ฅผ ๋ฐํํ๋ค.
5. ๊ธฐ๊ฐ, ์๊ฐ์ ๊ฐ๊ฒฉ - Duration, Period
๊ตฌ๋ถ | Period | Duration |
๋จ์ | ๋ , ์, ์ผ | ์๊ฐ, ๋ถ, ์ด, ๋๋ ธ์ด |
์ฌ์ฉ๋์ | ๋ ์ง | ์๊ฐ |
์ฃผ์ ๋ฉ์๋ | getYears(), getMonths(), getDays() | toHours(), toMinutes(), getSeconds(), getNano |
1) Period
- ๋ ๋ ์ง ์ฌ์ด์ ๊ฐ๊ฒฉ์ ๋ , ์, ์ผ ๋จ์๋ก ๋ํ๋ธ๋ค.
//Period ํด๋์ค ๊ตฌ์กฐ
public calss Period {
private final int years;
private final int months;
private final int days;
}
2) Duration
- ๋ ์๊ฐ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์, ๋ถ, ์ด ๋จ์๋ก ๋ํ๋ธ๋ค.
//Duration ํด๋์ค ๊ตฌ์กฐ
public class Duration {
private final long seconds;
private final int nonos;
}
6. ๋ ์ง์ ์๊ฐ ํต์ฌ ์ธํฐํ์ด์ค
- ํน์ ์์ ์ ์๊ฐ : Temproal(TemproalAccessor ํฌํจ) ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.
- ์๊ฐ์ ๊ฐ๊ฒฉ : TemproalAmount ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.
- TemporalAccessor๋ ์ฝ๊ธฐ ์ ์ฉ ์ ๊ทผ์, Temporal์ ์ฝ๊ธฐ์ ์ฐ๊ธฐ ๋ชจ๋๋ฅผ ์ง์ํ๋ค.
- TemproalAmount ์ธํฐํ์ด์ค๋ ์๊ฐ์ ๊ฐ๊ฒฉ์ ๋ํ๋ด๋ฉฐ, ๋ ์ง์ ์๊ฐ ๊ฐ์ฒด์ ์ ์ฉํ์ฌ ๊ทธ ๊ฐ์ฒด๋ฅผ ์กฐ์ ํ ์ ์๋ค.
1) ์๊ฐ์ ๋จ์์ ํ๋
- ์๊ฐ์ ๋จ์๋ฅผ ๋ปํ๋ TemproalUnit๊ณผ ์๊ฐ์ ๊ฐ ํ๋๋ฅผ ๋ปํ๋ TemproalField๊ฐ ์๋ค.
*์๊ฐ์ ๋จ์ - TemproalUnit, ChoronoUnit
- TemporalUnit ์ธํฐํ์ด์ค : ๋ ์ง์ ์๊ฐ์ ์ธก์ ํ๋ ๋จ์๋ฅผ ๋ํ๋ธ๋ค.
- ChronoUnit : ๋ค์ํ ์๊ฐ ๋จ์๋ฅผ ์ฌ๊ณตํ๋ค.
* ์๊ฐ์ ํ๋ - TemproalField
- ChronoField๋ ๋ ์ง ๋ฐ ์๊ฐ์ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉ๋๋ ์ด๊ฑฐํ์ด๋ค. ์ด ์ด๊ฑฐํ์ ๋ค์ํ ํ๋๋ฅผ ํตํด ์๊ฐ์ ํน์ ๋ถ๋ถ์ ๋ํ๋ธ๋ค.
2) ํธ์ ๋ฉ์๋ ์ ๊ณต
- get(TemproalField field)์ ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ๊ธธ์ด์ง๋ ๋ฐ ์ด๋ฅผ getXxx()๋ฅผ ํตํด ํด๊ฒฐ ๊ฐ๋ฅํ๋ค.
- ์์ฃผ ์ฌ์ฉํ์ง ์๋ ํน๋ณํ ๊ธฐ๋ฅ์ ํธ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์๋๋ฐ, ์ด๋ฌํ ๊ฒฝ์ฐ get(TemoriakField field)์ ์ฌ์ฉํ๋ฉด ๋๋ค.
7. ๋ ์ง์ ์๊ฐ ๋ฌธ์์ด ํผ์ฑ๊ณผ ํฌ๋งทํ
- ํฌ๋งทํ : ๋ ์ง์ ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ํฌ๋งท์ ๋ฌธ์์ด๋ก ๋ณ๊ฒฝํ๋ ๊ฒ (Date -> String)
- ํ์ฑ : ๋ฌธ์์ด์ ๋ ์ง์ ์๊ฐ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ ( String -> Date)
- LocalDate์ ๊ฐ์ ๋ ์ง ๊ฐ์ฒด๋ฅผ ์ํ๋ ํํ์ ๋ฌธ์๋ก ๋ณ๊ฒฝํ๋ ค๋ฉด DateTimeFormatter๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
- ์ฐธ๊ณ : https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html
1) ๋ฌธ์์ด์ ๋ ์ง์ ์๊ฐ์ผ๋ก ํ์ฑ
- ๋ฌธ์์ด์ ์ฝ์ด์ ๋ ์ง์ ์๊ฐ์ผ๋ก ๋ง๋๋ ๊ฒ์ ํ์ฑ์ด๋ผ๊ณ ํ๋๋ฐ, ์ด๋ ๋ฌธ์์ด์ ์ด๋ ๋ถ๋ถ์ด ๋ , ์, ์ผ์ธ์ง ๊ฐ๊ฐ์ ์์น๋ฅผ ์ ํด์ ์ฝ์ด์ผ ํ๋ค.
LocalDate.parse(inputm formatter)
- ์ฐธ๊ณ : ๊น์ํ์ ์ค์ ์๋ฐ - ์ค๊ธ 1ํธ
๋๊ธ