다른 답변, 특히 arganzheng 의 java.time 답변이 정확 합니다. 일부 언급했듯이, 오래된 java.util.Date/.Calendar 클래스는 잘못 설계되고 혼란스럽고 번거로우므로 피해야합니다. 그것들은 java.time 클래스에 의해 대체되었습니다.
자정 과 시간 범위를 다루는 전략에 대한 메모를 추가하겠습니다 .
반 오픈
날짜-시간 작업에서 시간 범위는 종종 "하프-오픈"접근 방식을 사용하여 정의됩니다. 이 접근법에서 시작은 포괄적 인 반면 결말은 독점적 입니다. 이렇게하면 문제가 해결되고 일관되게 사용하면 날짜-시간 처리에 대한 추론이 훨씬 쉬워집니다.
해결 된 한 가지 문제는 하루의 끝을 정의하는 것입니다. 오늘의 마지막 순간 23:59:59.999
( 밀리 초 )입니까? 아마도 java.util.Date 클래스 (최초의 Java에서; 번거 로움 –이 클래스를 피하십시오!)에서 그리고 매우 성공적인 Joda-Time 라이브러리에서. 그러나 Postgres와 같은 데이터베이스와 같은 다른 소프트웨어에서 마지막 순간은 23:59:59.999999
( 마이크로 초 )입니다. 그러나 java.time 프레임 워크 (Java 8 이상에 내장되어 Joda-Time의 후속 제품)와 같은 다른 소프트웨어와 H2 Database 와 같은 일부 데이터베이스 에서는 마지막 순간이 23:59.59.999999999
( 나노초 ) 일 수 있습니다 . 머리카락을 나누는 대신 마지막 순간이 아니라 첫 순간 만 생각하십시오.
Half-Open에서 하루는 하루 의 첫 순간부터 시작하여 다음 날의 첫 순간 까지는 포함되지 않습니다 . 따라서 다음과 같이 생각하십시오.
… 오늘 00:00 am (오늘 아침 자정)부터 12:00 pm (오늘 자정)까지.
… 이런 생각…
오늘의 첫 순간부터 내일의 첫 순간까지는 포함하지 않음 :
(> = 00:00:00.0
today AND < 00:00:00.0
tomorrow)
데이터베이스 작업에서이 방법은 SQL 에서 연산자 를 사용 하지 않음 을 의미 합니다.BETWEEN
하루의 시작
또한 하루 중 첫 순간이 항상 시간 이 아닙니다00:00:00.0
. 일부 시간대의 일광 절약 시간 (DST) 및 기타 이상 현상은 하루가 시작되는 다른 시간을 의미 할 수 있습니다.
따라서 java.time 클래스를 호출하여 하루의 시작을 결정하는 작업을 수행하십시오 LocalDate::atStartOfDay( ZoneId )
. 우리는을 통해 우회 할 수 있도록 LocalDate
하고 다시 ZonedDateTime
이 예제 코드에서 볼 수 있습니다.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( zoneId );
ZonedDateTime tomorrowStart = todayStart.plusDays( 1 );
옵션의 전달에 유의하십시오 ZoneId
. 생략하면 JVM의 현재 기본 시간대가 내재적으로 적용됩니다. 명시 적으로하는 것이 좋습니다.
시간대는 날짜-시간 작업에 중요합니다. 질문과 다른 답변은 시간대를 의식적으로 처리하지 않기 때문에 잠재적으로 결함이 있습니다.
변하게 하다
당신이 경우 해야한다 java.util.Date가 나 .Calendar를 사용, 그 오래된 클래스에 추가 된 새로운 변환 방법을 찾습니다.
java.util.Date utilDate = java.util.Date.from( todayStart.toInstant() );
java.util.GregorianCalendar gregCal = java.util.GregorianCalendar.from( todayStart );
시간의 경간
그건 그렇고, 오랜 시간 동안 많은 일을하고 있다면 다음을 살펴보십시오.
Duration
Period
Interval
이 Interval
클래스는 java.time 프레임 워크의 확장 인 ThreeTen-Extra 프로젝트에 있습니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다.
Interval todayMontreal = Interval.of( todayStart.toInstant() , tomorrowStart.toInstant() );
java.time에 대하여
java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date
, Calendar
, SimpleDateFormat
.
Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.
자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.
java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이 필요없고 수업이 필요 없습니다 .java.sql.*
java.time 클래스는 어디서 구할 수 있습니까?
ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval
, YearWeek
, YearQuarter
, 그리고 더 .