TL; DR
는
Interval.of(start.toInstant() , stop.toInstant()).contains(Instant.now())
, 반 오픈 처리를 일시에
반개 방법은 일반적으로 시간 간격을 정의하는데 사용된다. 처음은 ( 포함)이며 끝은 ()입니다. 따라서 1 주일은 월요일의 첫 번째 순간부터 시작하여 까지 실행되지만 다음 월요일의 첫 번째 시간 인을 포함하지 않는 것으로 정의됩니다. 우리는 때때로이 Half-Open 접근 방식을 직관적으로 사용합니다. 12시에서 1 시까 지의 점심 시간은 정오의 뇌졸중에서 시작하지만 에서 돌아오고 전에 시계가 오후 1시에 나타납니다. Half-Open을 사용하면 날짜와 시간에 관계없이 일관성있게 논리와 프로그래밍을보다 깔끔하고 단순하게 만들 수 있습니다.
그래서 논리가 있어야한다 "지금 하지 전에 시작되고 지금 는 종료 전에이다". "not before"는 "is is is or after is"라는 말의 간결한 표현입니다.
boolean isNowBetweenDateTime = (! now.before(startTime)) && now.before(endTime) ; // Not before start AND is before stop.
ZonedDateTime
는 질문과 다른 답변은 이제 java.time 클래스에 의해 대체 귀찮은 오래된 레거시 날짜 - 시간 클래스를 사용합니다.
ZonedDateTime
클래스는 지정된 시간대가있는 타임 라인의 한 순간을 나타냅니다.
ZoneId z = ZoneId.of("America/Montreal");
ZonedDateTime now = ZonedDateTime.now(z);
ZonedDateTime start = now.minusWeeks(1); // Simulating input.
ZonedDateTime stop = now.plusWeeks(2); // Simulating input.
로직을 직접 작성하여 테스트 할 수 있습니다.
Interval
이런 일의 이상을 수행하는 경우
Boolean isBetween = (! now.isBefore(start)) && stop.isBefore(stop);
의
ThreeTen-Extra 프로젝트 봐. 이 라이브러리는 추가 기능으로 java.time 클래스를 확장합니다. 특히
Interval
클래스는 타임 라인에서 모멘트 쌍을 나타내는 데 도움이됩니다.
contains
,
encloses
,
abuts
및
overlaps
과 같은 다양한 비교 방법을 구현합니다.
Interval
을 Instant
개체 쌍으로 인스턴스화하십시오. Instant
은 타임 라인상의 한 순간을 UTC으로 나타냅니다. 각 ZonedDateTime
개체에서 Instant
개체를 추출 할 수 있습니다.
Interval interval = Interval.of(start.toInstant() , stop.toInstant());
Boolean isBetween = interval.contains(now.toInstant()); // Or pass `Instant.now()`.
또한 Instant.now()
에 대한 호출이있는 Instant
으로 현재의 순간을 얻을 수 있습니다.
java.time 프레임 워크 나중에 자바 8에 내장되어 java.time 소개
. 이러한 클래스는 java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
과 같이 번거로운 이전 날짜 시간 클래스를 대체합니다.
Joda-Time 프로젝트는 현재 maintenance mode에 있으며, java.time으로 마이그레이션하는 것이 좋습니다.
자세히 알아 보려면 Oracle Tutorial을 참조하십시오. 그리고 많은 예제와 설명을 위해 스택 오버플로를 검색하십시오. java.time 기능의 대부분
ThreeTen-Backport는 자바 6 & 7 백 포팅 또한 (
How to use… 참조)에
ThreeTenABPAndroid하도록 구성된다.
ThreeTen-Extra 프로젝트는 추가 클래스로 java.time을 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 가능성을 입증합니다. 여기에 Interval
, YearWeek
, YearQuarter
등과 같은 유용한 클래스가 있습니다.
하나의 예민함 - 예상대로 작동하지 않을 수 있습니다. 현재 2 월 29 일이 4 년에 한 번 발생합니다. 그러나 그것은 OP를위한 관심사가 아닐 수도 있습니다. –
2 월 29 일이면 왜 작동하지 않습니까? – aioobe
나는 2 월 29 일과 같이 약간의 시간이 드물게 발생한다는 것을 OP가 깨닫지 못할 수도 있기 때문에 두 가지 임의의 날짜 사이에 있는지 물어 보는 것이 현명하지 않습니다. 또 다른 예로 도약 초 (http://en.wikipedia.org/wiki/File:Leapsecond.png)가 있습니다. 이는 드물게 발생합니다. –