2012-05-02 3 views
2

현재 시간이 설정된 간격 (startTime 및 endTime) 사이에있는 경우 true를 반환하는 Java로 메소드를 만들려고합니다.Java에서 시간이 두 Date 객체 내에 있는지 확인하는 방법

날짜는 부적합합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 여기

내 시도는 작동하지 않습니다되어

public boolean isNowBetweenDateTime() 
{ 
    final Date now = new Date(); 
    return now.after(startTime) && now.before(endTime); 
} 

시간은 년 월 일 무시하고, 두 Date 객체 내에 있는지 확인하기 (자바) 가장 좋은 방법은 무엇입니까?

답변

1

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, abutsoverlaps과 같은 다양한 비교 방법을 구현합니다.

IntervalInstant 개체 쌍으로 인스턴스화하십시오. 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 등과 같은 유용한 클래스가 있습니다.

3

코드가 좋아 보인다. now, startTimeendTime의 날짜를 하드 코딩 된 값으로 설정하면됩니다.

+0

하나의 예민함 - 예상대로 작동하지 않을 수 있습니다. 현재 2 월 29 일이 4 년에 한 번 발생합니다. 그러나 그것은 OP를위한 관심사가 아닐 수도 있습니다. –

+0

2 월 29 일이면 왜 작동하지 않습니까? – aioobe

+0

나는 2 월 29 일과 같이 약간의 시간이 드물게 발생한다는 것을 OP가 깨닫지 못할 수도 있기 때문에 두 가지 임의의 날짜 사이에 있는지 물어 보는 것이 현명하지 않습니다. 또 다른 예로 도약 초 (http://en.wikipedia.org/wiki/File:Leapsecond.png)가 있습니다. 이는 드물게 발생합니다. –

0

우선, 날짜 대신 달력을 사용하는 것이 좋습니다. 전에 날짜를 사용하여 몇 가지 문제가있었습니다. 그리고 날짜를 비교하는 데 밀리 초 단위로 시간을 사용합니다. 가장 안전한 방법입니다.

Date now = new Date(); 

long startTimeInMillis = startTime.getTime(); 
long endTimeInMillis = endTime.getTime(); 
return now.getTime >= startTimeInMillis && now.getTime < endTimeInMillis; 
+1

'java.util.Date'의'before'와'after' 메쏘드는 밀리 세컨드를 비교하기 때문에 이것을 할 필요가 없습니다. – dogbane

+0

... 게다가'getTime'은 1970 년 이래로 밀리 세컨드 수를 반환하기 때문에 날짜 문제가 남아 있습니다. – aioobe

+0

나는 약간 혼란 스럽다. 캘린더를 사용하여 추천하지만 코드에서 여전히 날짜를 사용 중입니다. 날짜 대신 달력을 사용할 때 차이점이 있습니까? – CodePrimate

0

을 당신이 날짜를 무시하고 단 하루의 시간을 고려, 특별히 설계 Joda 타임의 LocalTime이 만 시간 부분을 유지하기 위해 사용을 고려하려면 다음 코드는 같은 STH 수 wuoul. 현재 시간이 두 배 사이 인 경우

java.util.Date startTime = ... ; 
java.util.Date endTime = ... ; 

public boolean isNowBetweenDateTime() 
{ 
    // get current time 
    final LocalTime now = new LocalTime(); 

    // convert the java.util.Dates to LocalTimes and then compare 
    return now.isAfter(LocalTime.fromDateFields(startTime)) && 
      now.isBefore(LocalTime.fromDateFields(endTime)); 
} 
0

이 자바 함수가 true를 반환 : 여기

은 예입니다. 년/월/일을 무시합니다. 현재 시간이 01:00시간 이후 인 경우

try { 
    System.out.println(isNowBetweenHours()); 
} catch (ParseException e) { 

} 

을하지만 14:00 hours하기 전에, 그것은 사실 반환

import java.text.*; 
import java.util.Date; 

public static boolean isNowBetweenHours() throws ParseException 
{ 
    String leftBoundaryHours = "01:00:00"; //01:00 hours, military time.(1AM) 
    String rightBoundaryHours = "14:00:00"; //14:00 hours, military time.(2PM) 

    //returns true if current time is between 
    //leftBoundaryHours and rightBoundaryHours. 

    //This formatter converts a bare string to a date. 
    DateFormat formatter = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); 

    //add the hand specified time to 1970-01-01 to create left/right boundaries. 
    Date leftTimeBoundary = formatter.parse("1970-01-01 " + leftBoundaryHours); 
    Date rightTimeBoundary = formatter.parse("1970-01-01 " + rightBoundaryHours); 

    //extract only the hours, minutes and seconds from the current Date. 
    DateFormat extract_time_formatter = new SimpleDateFormat("HH:mm:ss"); 

    //Get the current time, put that into a string, add the 1970-01-01, 
    Date now = formatter.parse("1970-01-01 " + 
     extract_time_formatter.format(new Date())); 

    //So it is easy now, with the year, month and day forced as 1970-01-01 
    //all you do is make sure now is after left, and now is before right. 
    if (now.after(leftTimeBoundary) && now.before(rightTimeBoundary)) 
     return true; 
    else 
     return false; 
} 

은 다음과 같이 함수를 호출합니다. 그렇지 않으면 거짓을 반환합니다.

관련 문제