CHAP12 - Modern-Java-in-Action/Online-Study GitHub Wiki
๊ธฐ์กด Date
, Calendar
๋ฌธ์ ์ ์ ๋ณด์ํ๊ธฐ ์ํด, java.time
ํจํค์ง๊ฐ ์ถ๊ฐ๋์๋ค.
- Date ํจํค์ง์ ๋ฌธ์ ์ (1.1๋ถํฐ deprecated)
- ํน์ ์์ ์ ๋ ์ง๊ฐ ์๋ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ํํํ๋ฉฐ, ์คํ์ ์ 1900๋ ์ ๊ธฐ์ค์ผ๋ก ํจ.
- ๋ฌ ์ธ๋ฑ์ค๊ฐ 0๋ถํฐ ์์ํจ.
- JVM ๊ธฐ๋ณธ์๊ฐ๋์ธ ์ค์์ ๋ฝ์๊ฐ๋๋ฅผ ์ฌ์ฉํ๋, ์๊ฐ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ ์์.
- DateFormat ๊ธฐ๋ฅ์ ์ง์ํ๋ ์ค๋ ๋์ ์์ ํ์ง ์์.
- ๊ฐ๋ณ ํด๋์ค์ฌ์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ๋ก ์ ์ฉ์ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์.
- Calendar
- ๋ฌ์ ์ธ๋ฑ์ค๊ฐ 0๋ถํฐ ์์ํจ.
- Date์ ๋น๊ตํด์ DateFormat๋ฑ ์ผ๋ถ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์.
- ๊ฐ๋ณ ํด๋์ค์.
-
์ฃผ์ํน์ง
- ๋ชจ๋ ๋ถ๋ณํ์ด๋ค.
- ๊ฐ์ ๋ฐ๊พธ๋ฉด ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ฐํํ๋ค.
-
ํน์ ์์ ์ ์๊ฐ์ ํํ
- LocalDate : ์๊ฐ๋ ์ ๋ณด์ ์/๋ถ/์ด ์ ๋ณด์์ด, ์ฐ/์/์ผ.
- LocalTime : ์๊ฐ๋ ์ ๋ณด์ ์ฐ/์/์ผ ์ ๋ณด์์ด, ์/๋ถ/์ด.
- LocalDateTime : ์๊ฐ๋ ์ ๋ณด์์ด, ์ฐ/์/์ผ/์/๋ถ/์ด.
- Instant : ์ ๋์ค ์ํฌํฌ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ํน์ ์ง์ ๊น์ง ์๊ฐ์ ๋ฐ๋ฆฌ์ด๋ก ํํ.
- ์ ๋์ค ์ํฌํฌ์๊ฐ : 1970๋ 1์ 1์ผ 0์ 0๋ถ 0์ด UTC
- UTC ์ธ๊ณํ์ค์ / ๊ทธ๋ฆฌ๋์นํ์ค์ / ํ๊ตญ์๊ฐ-9
-
ํน์ ์์ ๊ฐ ์๊ฐ ์ฐจ์ด๋ฅผ ํํ
- Duration : ์/๋ถ/์ด ๋จ์๋ก ํน์ ์ง์ ๊ฐ ์๊ฐ ํํ.
- LocalTime ์ฌ์ฉ๋ถ๊ฐ, LocalDate/LocalDateTime ์ฌ์ฉ๊ฐ๋ฅ(1์ผ์ 24์๊ฐ์ผ๋ก ํํ)
- Period : ์ฐ/์/์ผ ๋จ์๋ก ํน์ ์ง์ ๊ฐ ์๊ฐ ํํ.
- LocalDate ์ฌ์ฉ๋ถ๊ฐ, LocalTime/LocalDateTime ์ฌ์ฉ๊ฐ๋ฅ(24์๊ฐ์ 1์ผ๋ก ํํ)
- Duration : ์/๋ถ/์ด ๋จ์๋ก ํน์ ์ง์ ๊ฐ ์๊ฐ ํํ.
๊ฐ์ฒด์์ฑ ๋ฐ ์ฌ์ฉ๋ฐฉ๋ฒ
LocalDate date = LocalDate.of(2017, 9, 21);
int year = date.getYear();
Month month = date.getMonth();
int day = date.getDayOfMonth();
DayOfWeek dow = date.getDayOfWeek();
LocalDate date2 = LocalDate.parse("2017-09-21");
๊ฐ์ฒด ๋ฉค๋ฒ๋ณ์ ์ ๊ทผ๋ฐฉ๋ฒ
LocalDate nowDate = LocalDate.now();
System.out.println(nowDate);
//get๋ฉ์๋์ ChronoField Enum์ ๋๊ฒจ๋ ๋๋ค
int y = date.get(ChronoField.YEAR);
int m = date.get(ChronoField.MONTH_OF_YEAR);
int d = date.get(ChronoField.DAY_OF_MONTH);
System.out.println(y+" "+m+" "+d);
//ํญ๋ชฉ๋ง๋ค ์ ์๋ get๋ฉ์๋๋ฅผ ํธ์ถํด๋ ๋๋ค
int y2 = date.getYear();
int m2 = date.getMonthValue();
int d2 = date.getDayOfMonth();
System.out.println(y2+" "+m2+" "+d2);
์ ์ฉํ ๊ธฐ๋ฅ
int len = date.lengthOfMonth(); //๋ฌ๋ง๋ค ์ผ ์
boolean leap = date.isLeapYear(); //์ค๋
์ฌ๋ถ๋ฅผ ์ ์ ์์
System.out.println(month.getValue()); //๋ฌ์ 1์๋ถํฐ 1, 12์์ด 12
System.out.println(dow.getValue()); //์์ผ์ ์์์ผ๋ถํฐ 1, ์ผ์์ผ์ด 7
๊ฐ์ฒด์์ฑ ๋ฐ ์ฌ์ฉ๋ฐฉ๋ฒ
//LocalTime
LocalTime time = LocalTime.of(13, 45, 20);
int hour = time.getHour();
int minute = time.getMinute();
int second = time.getSecond();
//๋ฌธ์์ด์ ํ์ฑํด์ ๋ง๋ค ์๋ ์์
LocalTime time2 = LocalTime.parse("13:45:20");
//LocalDateTime์ ๋ ์ง, ์๊ฐ ๋ชจ๋๋ฅผ ํํ
LocalDateTime dt1 = LocalDateTime.of(2017, Month.SEPTEMBER, 21, 13, 45, 20);
System.out.println(Month.SEPTEMBER);
LocalTime, LocalDate๋ฅผ ๋ณํํ ์ ์๋ค.
LocalDateTime dt2 = LocalDateTime.of(date, time);
LocalDateTime dt3 = date.atTime(13, 45, 20);
LocalDateTime dt4 = date.atTime(time);
LocalDateTime dt5 = time.atDate(date);
LocalDate date3 = dt1.toLocalDate();
LocalTime time3 = dt1.toLocalTime();
Instant๋ ์๊ฐ์ ๋ฐ๋ฆฌ์ด๋จ์๋ก ํํํ๋ค.
//Instant
System.out.println(Instant.ofEpochSecond(3));
System.out.println(Instant.ofEpochSecond(3, 0));
System.out.println(Instant.ofEpochSecond(2, 1_000_000_000));
System.out.println(Instant.ofEpochSecond(4, -1_000_000_000));
์ธ์คํดํธ์์ ๋ฐ๋ก ์ฐ/์/์ผ/์/๋ถ/์ด ์ ๋ณด๋ฅผ ์ฝ์ผ๋ ค๊ณ ํ๋ฉด ์์ธ๋ฅผ ๋์ง๋ค. LocalDate ๋ฑ์ผ๋ก ๋ณํํ๊ณ ์ฝ์ด์ผ ํ๋ค.
try{
int day = Instant.now().get(ChronoField.DAY_OF_MONTH);
}catch(UnsupportedTemporalTypeException e){
e.printStackTrace();
}
//๋ณํํ ๋๋ ์๊ฐ๋์ ๋ณด๋ฅผ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค. ์๊ฐ๋์ ๋ณด๋ ๋ค๋ค์์ ์์ ๋ค๋ฃธ.
int day = DateTime.ofInstant(Instant.now(), ZoneOffset.UTC).get(ChronoField.DAY_OF_MONTH);
Duration์ ํน์ ์์ ๊ฐ ์๊ฐ์ฐจ๋ฅผ ์/๋ถ/์ด๋ก ํํํ๋ฏ๋ก LocalDate์๋ ์ฌ์ฉํ ์ ์๋ค.
//Duration
LocalTime time1 = LocalTime.now();
LocalTime time2 = time1.plusHours(1);
LocalDate dateTime1 = LocalDate.now();
LocalDate dateTime2 = dateTime1.plusDays(1);
Instant instant1 = Instant.now();
Instant instant2 = instant1.plusMillis(1000);
Duration d1 = Duration.between(time1, time2);
System.out.println("d1: "+d1);
try{ //Duration์ ์ด์ ๋๋
ธ์ด๋ก ์๊ฐ๋จ์๋ฅผ ํํํ๋ฏ๋ก LocalDate๋ ์ฌ์ฉํ ์ ์๋ค.
Duration d2 = Duration.between(dateTime1, dateTime2);
System.out.println("d2: "+d2);
}catch(UnsupportedTemporalTypeException e){
//e.printStackTrace();
}
Duration d3 = Duration.between(instant1, instant2);
System.out.println("d3: "+d3);
Period๋ ํน์ ์์ ๊ฐ ์๊ฐ์ฐจ๋ฅผ ์ฐ/์/์ผ๋ก ํํํ๋ค. ๋ฐ๋ผ์ LocalTime์๋ ์ฌ์ฉํ ์๊ฐ ์๋ค. LocalDateTime์ผ๋ก ๊ณ์ฐํด๋ ์์ธ๋ฅผ ๋์ง๋ค.
LocalDateTime ldt1 = LocalDateTime.now();
LocalDateTime ldt2 = ldt1.plusYears(1);
Duration test = Duration.between(ldt1, ldt2);
System.out.println("duration test: "+test);
//Period test2 = Period.between(ldt1, ldt2); //์์ธ๋ฅผ ๋์ง๋ค
Period test2 = Period.between(ldt1.toLocalDate(), ldt2.toLocalDate());
System.out.println("period test: "+test2);
//period test: P1Y
๋ค๋ง, Duration์ผ๋ก LocalDateTime๊ฐ ์๊ฐ์ฐจ๋ฅผ ๊ณ์ฐํ๋ฉด ์ฐ/์/์ผ์ ์๊ฐ์ผ๋ก ๋ณํํด์ ์ถ๋ ฅํ๋ค.
LocalDateTime ldt1 = LocalDateTime.now();
LocalDateTime ldt2 = ldt1.plusYears(1);
Duration test = Duration.between(ldt1, ldt2);
System.out.println("duration test: "+test);
//duration test: PT8760H
-
Duration๊ณผ Period๊ฐ ๊ณตํต์ผ๋ก ์ ๊ณตํ๋ ๋ฉ์๋
//with์ผ๋ก ๊ฐ์ ์ง์
LocalDate date1 = LocalDate.of(2017, 9, 21);
LocalDate date2 = date1.withYear(2011);
LocalDate date3 = date2.withDayOfMonth(25);
LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR, 2);
//plus, minus๋ก ์ฐ์ฐ
LocalDate date22 = date1.plusWeeks(1);
LocalDate date33 = date22.minusYears(1);
LocalDate date44 = date33.plus(6, ChronoUnit.MONTHS);
-
๋ ์ง/์๊ฐ ํด๋์ค์ ๊ณตํต ๋ฉ์๋
๋ค์ ์ฝ๋๋ฅผ ์คํํ์ ๋ date์ ๋ณ์ซ๊ฐ์?
LocalDate date = LocalDate.of(2014, 3, 18);
date = date.with(ChronoField.MONTH_OF_YEAR, 9);
date = date.plusYears(2).minusDays(10);
date.withYear(2011);
์ ๋ต
2016-09-08LocalDate date1 = LocalDate.now(); //2022-01-21
LocalDate date2 = date1.with(nextOrSame(DayOfWeek.SUNDAY)); //2022-01-23
LocalDate date3 = date2.with(lastDayOfMonth()); //2022-01-31
-
Temporal
TemporalAdjuster ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฒ์ด TemporalAdjusters์ด๋ค. ์ปค์คํ ์ผ๋ก ์ง์ ๋ง๋ค ์๋ ์๋ค. ์ด๋ฅผํ ๋ฉด ๋ค์ ๊ทผ๋ฌด์ผ์ ๊ตฌํ๋ TemporalAdjuster๋ ๋ค์๊ณผ ๊ฐ์ด ๋ง๋ค ์ ์๋ค.
- TemporalAdjuster๋ฅผ ํด๋์ค๋ก ๊ตฌํํ๊ณ ์ธ์คํด์ค๋ฅผ ์์ฑํด ์ธ์๋ก ๋๊ธฐ๊ธฐ
LocalDate date = LocalDate.now().with(new NextWorkingDay());
import java.time.DayOfWeek;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjuster;
public class NextWorkingDay implements TemporalAdjuster {
@Override
public Temporal adjustInto(Temporal temporal) {
DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
int dayToAdd = 1;
if(dow == DayOfWeek.FRIDAY) dayToAdd = 3;
else if(dow == DayOfWeek.SATURDAY) dayToAdd = 2;
return temporal.plus(dayToAdd, ChronoUnit.DAYS);
}
}
- TemporalAdjuster๋ฅผ ๋๋ค๋ก ๊ตฌํํด ์ธ์๋ก ๋๊ธฐ๊ธฐ
LocalDate date1 = LocalDate.now().with(
temporal -> {
DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
int dayToAdd = 1;
if(dow==DayOfWeek.FRIDAY) dayToAdd = 3;
else if(dow==DayOfWeek.SATURDAY) dayToAdd = 2;
return temporal.plus(dayToAdd, ChronoUnit.DAYS);
}
);
- ๋๋ค๋ก ๊ตฌํํ TemporalAdjuster๋ฅผ ๋ณ์์ ์ ์ฅํ๋ค๊ฐ ์ฌ์ฉํ๊ธฐ
TemporalAdjuster nextWorkingDay = TemporalAdjusters.ofDateAdjuster(
temporal -> {
DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
int dayToAdd = 1;
if(dow==DayOfWeek.FRIDAY) dayToAdd = 3;
else if(dow==DayOfWeek.SATURDAY) dayToAdd = 2;
return temporal.plus(dayToAdd, ChronoUnit.DAYS);
}
);
LocalDate date2 = LocalDate.now().with(nextWorkingDay);
์ถ๋ ฅํ๊ธฐ
LocalDate date = LocalDate.of(2014, 3, 18);
System.out.println(date.format(DateTimeFormatter.BASIC_ISO_DATE));
//20140318
System.out.println(date.format(DateTimeFormatter.ISO_LOCAL_DATE));
//2014-03-18
ํ์ฑํ๊ธฐ
LocalDate date2 = LocalDate.parse("20140318", DateTimeFormatter.BASIC_ISO_DATE);
LocalDate date3 = LocalDate.parse("2014-03-18", DateTimeFormatter.ISO_LOCAL_DATE);
System.out.println(date2);
System.out.println(date3);
ํฌ๋งท ์ ํ๊ธฐ
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate date4 = LocalDate.now();
String formattedDate = date4.format(formatter);
System.out.println(formattedDate);
//21/01/2022
LocalDate date5 = LocalDate.parse(formattedDate, formatter);
System.out.println(date5);
//2022-01-21
ํฌ๋งท ์ ํ๊ณ , Locale์ง์ ํ๊ธฐ
DateTimeFormatter timeFomatterItalian = DateTimeFormatter.ofPattern("dd/MMMM/yyyy", Locale.ITALIAN);
String formattedDateItalian = LocalDate.now().format(timeFomatterItalian);
DateTimeFormatter timeFomatterKorean = DateTimeFormatter.ofPattern("dd/MMMM/yyyy", Locale.KOREAN);
String formattedDateKorean = LocalDate.now().format(timeFomatterKorean);
System.out.println(formattedDateItalian); //21/gennaio/2022
System.out.println(formattedDateKorean); //21/1์/2022
๋ฉ์๋ ์ฒด์ธ ๋ฐฉ์์ผ๋ก ํฌ๋งท์ ์ ํ๊ธฐ
DateTimeFormatter koreanFormatter = new DateTimeFormatterBuilder()
.appendLiteral("'")
.appendText(ChronoField.YEAR)
.appendLiteral(".")
.appendText(ChronoField.MONTH_OF_YEAR)
.appendLiteral(".")
.appendText(ChronoField.DAY_OF_MONTH)
.appendLiteral(".")
.appendLiteral("(")
.appendText(ChronoField.DAY_OF_WEEK)
.appendLiteral(")")
.parseCaseInsensitive()
.toFormatter(Locale.KOREA);
String formattedDateKo2 = LocalDate.now().format(koreanFormatter);
System.out.println(formattedDateKo2);
//'2022.1์.21.(๊ธ์์ผ)
-
ZonedDateTime : ์๊ฐ๋ ์ ๋ณด๋ฅผ ํฌํจํ ๋ ์ง, ์๊ฐ ์ ๋ณด
ZoneId romeZone = ZoneId.of("Europe/Rome");
ZoneId korZone = ZoneId.of("Asia/Tokyo");
LocalDateTime dateTime = LocalDateTime.now();
ZonedDateTime zdt2 = dateTime.atZone(romeZone);
System.out.println(zdt2); //ํ๊ตญ์๊ฐ ๊ธฐ์ค ๋ก๋ง์๊ฐ๋๋ก ๋ณํํด์ค > ์?
zdt2 = dateTime.atZone(korZone);
System.out.println(zdt2); //ํ๊ตญ์๊ฐ๋๋ก ๋ณํํด์ค
-
์ฌ๊ธฐ์ ์๋ฌธ, LocalDateTime์ ZonedDateTime์ผ๋ก ๋ฐ๊ฟ ๋ ์ ๊ธฐ์ค์๊ฐ์ ํ๊ตญ์๊ฐ์ผ๋ก ์ก์์๊น, ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ณผ์ ์ ์ด๋ป๊ฒ ์ด๋ค์ง๊น?
- ๋๋ฒ์งธ ์ธ์๋ก ๊ธฐ์ค ์๊ฐ๋๋ฅผ ๋๊ธธ ์ ์๋ค.
- ์๋ค๋ฉด ZoneRules์ ์ ์๋ ๊ธฐ์ค๋๋ก ํด๋น์๊ฐ์ ๋ง๋ ์๊ฐ๋๋ฅผ ์ฐพ์ ๊ธฐ์ค ์๊ฐ๋๋ก ์ผ๋๋ค(UTC๋ฅผ ๊ตฌํ๊ณ ์ผ๋ง๋ ์ฐจ์ด๋๋์ง ํ์ธํ๋ค.)
- ๊ทธ๋์ ํ๊ตญ์์ ์์ฑํ LocalDateTime ๊ฐ์ฒด๋ฅผ ๋ฐ๋์์ ZonedDateTime์ผ๋ก ๋ฐ๊พผ๋ค๋ฉด ์๋ํ์ง ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
//ํธํ์ฑ์ ์ํด Instant๋ก ์์
ํ๋๊ฒ์ด ์ ๋ฆฌ
LocalDateTime dt = LocalDateTime.ofInstant(Instant.now(), ZoneOffset.UTC);
LocalDateTime dt2 = LocalDateTime.ofInstant(Instant.now(), ZoneId.of("Europe/Rome"));
LocalDateTime dt3 = LocalDateTime.ofInstant(Instant.now(), ZoneId.of("Asia/Tokyo"));
System.out.println(dt); //2022-01-21T10:47:21.983854600
System.out.println(dt2); //2022-01-21T11:47:21.983854600
System.out.println(dt3); //2022-01-21T11:47:21.983854600
์๊ฐ๋๋ณ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํด Instant๋ก ์์ ํ๋ ๊ฒ์ด ์ ๋ฆฌ.
์ผ๋ณธ๋ฌ๋ ฅ ๊ณ์ฐํ๊ธฐ.
LocalDate date = LocalDate.of(2014, Month.MARCH, 18);
JapaneseDate japaneseDate = JapaneseDate.from(date);
System.out.println(japaneseDate); //Japanese Heisei 26-03-18
์ด์ฌ๋๋ ฅ ๊ณ์ฐํ๊ธฐ.
HijrahDate ramadanDate = HijrahDate.now()
.with(ChronoField.DAY_OF_MONTH, 1)
.with(ChronoField.MONTH_OF_YEAR, 9);
System.out.println("Ramadan starts on " + IsoChronology.INSTANCE.date(ramadanDate)
+ " and ends on" + IsoChronology.INSTANCE.date(ramadanDate.with(TemporalAdjusters.lastDayOfMonth())));
๋ง์ผ๋ฌ๋ ฅ, ํ์ํ์๋ ฅ ๋ฑ ์ง์ญํ๋ ๋ฌ๋ ฅ ์์คํ ์ ๋ง๋ค ์ ์๋ค. ๋ค๋ง, 1๋ ์ด 12๊ฐ์, 1๋ฌ์ 31์ผ ์ดํ, 1๋ ์ด ์ ํด์ง ์์ ๋ฌ๋ก ์ด๋ฃจ์ด์ง๋ค๋ ์ผ๋ฐ์ ์ธ ๊ฐ์ ์ ์ ์ฉํ ์ ์๋ค. ๋ฐ๋ผ์ ํ๋ก๊ทธ๋จ ์ ์ถ๋ ฅ์ ์ง์ญํํ๋ ์ํฉ์ ์ ์ธํ๋ฉด LocalDate๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
Chronology japaneseChronology = Chronology.ofLocale(Locale.JAPAN);
ChronoLocalDate now = japaneseChronology.dateNow();
System.out.println(now);
-
(10๋ถ) The Problem with Time & Timezones - Computerphile - YouTube
-
๊ฐ๋จํ ์์
- ์จ๋ฆฌ์ฐ์ค๋ ฅ์์ ๊ทธ๋ ๊ณ ๋ฆฌ๋ ฅ์ผ๋ก ๋ฐ๊ฟ ๋, ์ค์ฐจ๋ฅผ ์กฐ์ ํ๊ธฐ ์ํด ์ดํ์ ๊ฑด๋๋ฐ์๋ค.
- ๋๋ผ๋ง๋ค ๊ทธ๋ ๊ณ ๋ฆฌ๋ ฅ์ ๋ฐ์๋ค์ธ ์๊ธฐ๊ฐ ๋ค๋ฅด๋ค.
- ๊ฐ์ ์ฅ์์์ ๋ค๋ฅธ ์๊ฐ๋๋ฅผ ์ด๋ค.
- ์ด์ค๋ผ์์ ์ ๋์ธ๊ณผ ํ๋ ์คํ์ธ๋ผ๋ฆฌ
- ๋ฏธ๊ตญ ๋ด ์ธ๋์ธ๋ณดํธ๊ตฌ์ญ
- ์ผ๋ถ ๊ตญ๊ฐ์์ ์ฌ๋ฆ์ ํ์๊ฐ ๋น๊ฒจ ์ํํ๋ ์๋จธํ์์ ์ ์ฉํ๋ค.
- ๊ฐ์ ๊ตญ๊ฐ๋ผ๋ ์๋จธํ์ ์ ์ฉ์ฌ๋ถ๊ฐ ์ง์ญ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
- ๋จ๋ฐ๊ตฌ์ ๋ถ๋ฐ๊ตฌ์ ๊ณ์ ์ด ๋ฐ๋์ด๋ฏ๋ก, ๋จ๋ฐ๊ตฌ๋ ์๋จธํ์์ 11์์ ์ ์ฉํ๋ค.
- ์ผ๋ถ ๊ตญ๊ฐ๋ ์์ ์๊ฐ๋๋ฅผ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ๊ฐ ์๋ค.
- ๋ฌ๋ ฅ์ ์ค์ฐจ๋ฅผ ์กฐ์ ํ๊ธฐ ์ํด '์ค์ด'๋ฅผ ์ฌ์ฉํ๋ค.
- ์ค์ด๊ฐ ์ฝ์ ๋ ๋ ์ ๋ง์ง๋ง์ 59 / 59 / 00์ผ๋ก ํ๋ฉด 1์ด๋งํผ์ ์๊ฐ ๋๋ ์ด๊ฐ ์๊ธด๋ค.
- ์ค์ด๊ฐ ์ฝ์ ๋ ๋ ์ ๋ง์ง๋ง์ 59 / 60 / 00์ผ๋ก ํ๋ฉด ๋ชจ๋ ์๊ฐ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ ์ํด์ผ ํ๋ค.
- ์ค์ด๋ฅผ 24 * 60 * 60์ผ๋ก ๋๋์ด์ ์ค์ด๊ฐ ์ฝ์ ๋ ๋ ์ 1์ด๋ง๋ค a๋ฐ๋ฆฌ์ด๋ฅผ ๋ํด์ฃผ๋ฉด, ์๊ฐ๋๊ธฐํ/์๊ฐ์ฒ๋ฆฌ ๋ฌธ์ ๋ ํด๊ฒฐ๋๋ 1์ด๊ฐ ๋ถ์ ํํด์ง๋ค.
- ์จ๋ฆฌ์ฐ์ค๋ ฅ์์ ๊ทธ๋ ๊ณ ๋ฆฌ๋ ฅ์ผ๋ก ๋ฐ๊ฟ ๋, ์ค์ฐจ๋ฅผ ์กฐ์ ํ๊ธฐ ์ํด ์ดํ์ ๊ฑด๋๋ฐ์๋ค.
-
ํฉ๋ฆฌ์ ์ธ ๋์ : joda-time ๋ฑ ์ด๋ฏธ ๊ฒ์ฆ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ , ์์์ ์ธ๊ธํ ๋ฌธ์ ๋ฅผ ํผ์ ํด๊ฒฐํ๋ ค๋ ์๊ฐ์ ๋ฒ๋ฆฐ๋ค.