2013-05-13 1 views
2

3 일 또는 5 주 (한 가지 필드 유형 만있는 기간)와 같은 기간이 주어지면 주어진 DateTime을 가장 가까운 단위로 반올림합니다 기간 (즉, '5 일'의 5를 무시하십시오). 예 :Joda-Time을 사용하여 주어진 기간을 기준으로 DateTime을 반올림합니다.

예 1 :

  • 기간 : 삼일.
  • 날짜 시간 : 수요일 세계 협정시 오전 4시 26분 (2013-05-15T04 : 26 : 00Z)
  • 둥근 날짜 시간 : 수요일 자정 UTC (2013-05-15T00 : 00 : 00Z)

예 2 :

  • 기간 : 오주.
  • 날짜 시간 : 수요일 세계 협정시 오전 4시 26분 (2013-05-15T04 : 26 : 00Z)
  • 둥근 날짜 시간 : 월요일 자정 UTC (2013-05-13T00 : 00 : 00Z)

초기 생각은 PeriodDurationFieldType getFieldTypes() 방법을 사용하고 DateTime (가장 큰 필드 아래)의 모든 일치하는 필드에 대해 0으로 설정하는 것이 었습니다. 그러나 DateTime에서 DateTimeFieldType을 가져 오는 방법과 DurationFieldType과 비교하는 방법을 모르겠습니다.

if else 접근 방법을 선호하지 않습니다. 코멘트

답변

0

너무 긴 :

수단 "반올림"라는 것을 명확하지 않다. 우선, DateTime이 아닌 LocalDateTime을 처리해야합니다 (매우 다른 것입니다. 내 대답 here 참조).

"기간"단위의 해상도보다 낮은 모든 필드를 0으로 설정하고 다음 필드를 주어진 값의 배수로 설정하려고합니다. 그렇습니까? 그렇다면 두 번째 예를 이해하지 못합니다. (어디에서 5 주입니까?) 어쨌든, 잘못 지정 될 것입니다. "40 개월"의 기간은 어떻게해야합니까?

+0

예, 나는 열심히 내 문제를 표현하는 발견했다. 당신은 완벽하게 이해합니다. 40 개월의 기간은 정확히 1 개월과 같습니다. 나는 LocalDateTime을 사용하여 조사 할 것이다. – Kevin

+0

그러나 '2013-05-13'을 5 주 동안 어떻게 얻는 지 설명해 주시겠습니까? 당신은 일년 내내 세고 있으며 가장 가까운 배수 인 5를 고르고 있습니까? – leonbloy

+0

저는 'weeks'단위 만 신경 쓰고, 주어진 'DateTime'을 가장 가까운 주 시작 부분으로 반올림합니다. 40 개월과 동일하게, 가장 가까운 달로 내림하고 싶습니다 (주어진'DateTime'에서). 나는 40 개월과 같은 기간을 받아 들여야하지만이 계산에는 '월'부분 만 필요합니다. – Kevin

1

예 벨로우는 기간을 일 단위로 표현할 수있는 경우의 해결책입니다 (주, 월 등으로 수정할 수 있음). DateTime Joda Java 라이브러리 사용.

불행히도 반올림으로 인해 가능한 문제가 발생해야합니다. 기간을 계산할 때부터 시작 시점을 가져야합니다. 아래 예에서 1970/01/01 00:00:00 UTC 이후로 기간을 계산합니다. 아니면 실제로 한달 (1 년)의 첫날부터 3 일간의 기간을 얻으려고하십니까? 그것은 더 이해가됩니다.

자문을 받아야하는 질문 : 윤년에는 어떻게됩니까?

자바 방법

DateTime roundDays(DateTime dt, int windowDays) { 
    Duration p = Duration.standardDays(windowDays); 

    long t = dt.getMillis()/p.getMillis() * p.getMillis(); 
    // Keep TimeZone and round floor to a day 
    return new DateTime(t, dt.getZone()).dayOfMonth().roundFloorCopy(); 
} 

사용 예 :

DateTime dt = new DateTime(1385578964580L, DateTimeZone.UTC); 

System.out.println(roundDays(dt, 3)); 
System.out.println(roundDays(dt.plusDays(2), 3)); 
System.out.println(roundDays(dt.plusDays(4), 3)); 
System.out.println(roundDays(dt.plusDays(6), 3)); 

// Prints data rounded to every 3 days 
// 2013-11-26T00:00:00.000Z 
// 2013-11-29T00:00:00.000Z 
// 2013-11-29T00:00:00.000Z 
// 2013-12-02T00:00:00.000Z 
+0

나는 예를 들고 라운드 분을 감당할 수 있었고 그것은 훌륭하게 작동합니다. 게시 해 주셔서 감사합니다! – Melloware

관련 문제