Java에서 시간없이 날짜 가져 오기

1. 소개

이 짧은 튜토리얼에서는 Java에서 시간없이 날짜 를 얻는 방법을 보여줍니다 .

Java 8에서 새로운 시간 API가 출시 된 후 상황이 조금 달라졌 기 때문에 Java 8 전후에이를 수행하는 방법을 보여줄 것입니다.

2. Java 8 이전

Java 8 이전에는 Joda-time과 같은 타사 라이브러리를 사용하지 않는 한 시간없이 날짜 를 얻는 직접적인 방법이 없었 습니다.

이는 Java Date 클래스가 특정 순간을 밀리 초 단위로 표현하기 때문입니다 . 따라서 Date 의 시간을 무시할 수 없습니다 .

다음 섹션에서는이 문제를 해결하기위한 몇 가지 일반적인 해결 방법을 보여줍니다.

2.1. 캘린더 사용

얻을 수있는 가장 일반적인 방법 중 하나는 날짜 시간이없는가하는 것입니다 사용 달력 제로로 시간을 설정하는 클래스 . 이렇게함으로써 우리는 하루의 시작에 설정된 시간으로 깨끗한 날짜를 얻습니다.

코드에서 봅시다 :

public static Date getDateWithoutTimeUsingCalendar() { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTime(); }

이 메서드를 호출하면 다음과 같은 날짜를 얻습니다.

Sat Jun 23 00:00:00 CEST 2018

보시다시피 시간이 0으로 설정된 전체 날짜를 반환하지만 시간을 무시할 수는 없습니다 .

또한 반환 된 날짜에 설정된 시간이 없는지 확인하기 위해 다음 테스트를 만들 수 있습니다.

@Test public void whenGettingDateWithoutTimeUsingCalendar_thenReturnDateWithoutTime() { Date dateWithoutTime = DateWithoutTime.getDateWithoutTimeUsingCalendar(); Calendar calendar = Calendar.getInstance(); calendar.setTime(dateWithoutTime); int day = calendar.get(Calendar.DAY_OF_MONTH); calendar.setTimeInMillis(dateWithoutTime.getTime() + MILLISECONDS_PER_DAY - 1); assertEquals(day, calendar.get(Calendar.DAY_OF_MONTH)); calendar.setTimeInMillis(dateWithoutTime.getTime() + MILLISECONDS_PER_DAY); assertNotEquals(day, calendar.get(Calendar.DAY_OF_MONTH)); }

보시다시피, 하루의 밀리 초에서 1을 뺀 날짜를 더하면 여전히 같은 날을 얻지 만 하루를 더하면 다음 날이됩니다.

2.2. 포맷터 사용

이를 수행하는 또 다른 방법 날짜 를 시간없이 문자열 로 포맷 한 다음 해당 문자열을 다시 Date 로 변환하는 것 입니다. 때문에 문자열 하여 시간없이 포맷 한 날짜가 제로로 설정 한 시간이있을 것이다 변환됩니다.

어떻게 작동하는지 구현해 보겠습니다.

public static Date getDateWithoutTimeUsingFormat() throws ParseException { SimpleDateFormat formatter = new SimpleDateFormat( "dd/MM/yyyy"); return formatter.parse(formatter.format(new Date())); }

이 구현은 이전 섹션에 표시된 메서드와 동일하게 반환됩니다.

Sat Jun 23 00:00:00 CEST 2018

다시 말하지만, 반환 된 날짜에 시간이 없는지 확인하기 위해 이전과 같은 테스트를 사용할 수 있습니다 .

3. Java 8 사용

Java 8에서 새로운 시간 API가 출시됨에 따라 시간없이 날짜를 얻는 더 쉬운 방법이 있습니다. 이 새로운 API가 가져온 새로운 기능 중 하나는 시간이 있거나없는 날짜로 작업하거나 시간으로 만 작업 할 수있는 여러 클래스가 있다는 것입니다.

이 기사에서는 시간이없는 날짜를 정확하게 나타내는 LocalDate 클래스에 초점을 맞출 것 입니다.

이 예제를 통해 살펴 보겠습니다.

public static LocalDate getLocalDate() { return LocalDate.now(); }

이 메서드는 다음 날짜 표현을 사용 하여 LocalDate 개체를 반환합니다 .

2018-06-23

보시다시피 날짜 만 반환 하고 시간은 완전히 무시 됩니다.

다시 말하지만,이 메서드가 예상대로 작동하는지 확인하기 위해 이전과 같이 테스트 해 보겠습니다.

@Test public void whenGettingLocalDate_thenReturnDateWithoutTime() { LocalDate localDate = DateWithoutTime.getLocalDate(); long millisLocalDate = localDate .atStartOfDay() .toInstant(OffsetDateTime .now() .getOffset()) .toEpochMilli(); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis( millisLocalDate + MILLISECONDS_PER_DAY - 1); assertEquals( localDate.getDayOfMonth(), calendar.get(Calendar.DAY_OF_MONTH)); calendar.setTimeInMillis(millisLocalDate + MILLISECONDS_PER_DAY); assertNotEquals( localDate.getDayOfMonth(), calendar.get(Calendar.DAY_OF_MONTH)); }

4. 결론

이 기사에서는 Java에서 시간없이 날짜 를 얻는 방법을 보여주었습니다 . 먼저 Java 8 이전에 Java 8을 사용하는 방법을 보여주었습니다.

기사에서 구현 된 예제에서 볼 수 있듯이 Java 8을 사용 하는 것이 항상 선호되는 옵션이어야합니다 . 시간없이 날짜로 작업 할 수있는 특정 표현이 있기 때문입니다.

항상 그렇듯이 예제의 전체 소스 코드는 GitHub에서 사용할 수 있습니다.