๋ธ๋ก๊ทธ ์ฎ๊ฒผ์ต๋๋ค! ๐ก 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");