2013-06-18 2 views
2

조다 타임 (Joda Time)에서 인간 중심 스타일 시대를 손쉽게 얻을 수있는 방법이 있습니까?Joda 시간의 진행 기간은 어떻게 받습니까?

예를 들어 지난 4 일간을 원한다면 3 일 동안 전체 기간과 현재 진행중인 현재 시간까지 나에게주기를 제공하십시오. 그래서 나는 1 일, 1 일, 1 일, n 시간의 간격을 현재 시간까지 예상 할 수 있습니다.

지난 5 주 동안 현재 주까지 4 주간 및 진행중인 주간을 알려주십시오.

나는 이것을 가지고 약간의 시간을 보냈으며, 어려운 부분은 인간의 말의 인간 정의에 대한 기간을 "정상화"하려고하는 것이다. 그래서 오늘까지는 하루의 시작 (항상 자정)으로 정상화하고 그 사이의 간격을 찾아야합니다. 미친 까다로운 개월 동안, 당신은 달의 시작 부분으로 정상화하고 지금 갈 필요가 있습니다 ... 등등이 훨씬 더 어려워 내가 기간 특정 정규화 논리와 함께 거대한 사건 진술을 피하기 위해 노력하고 나는 두뇌를 깨고 일반적인 접근법을 찾는다.

여기 (그루비에서) 내 현재 코드는

static List generatePreviousIntervals(BaseSingleFieldPeriod period, 
           int count, 
           DateTime end = DateTime.now()) { 

    if (count < 1) { 
     return [] 
    } 

    def intervals = [] 
    Interval last 
    count.times { 
     def finish = last?.start ?: end 
     def next = new Interval(period, finish) 

     intervals.add(next) 
     last = next 
    } 

    // reverse so intervals are in normal progression order 
    intervals.reverse() 
} 

뭔가 Joda 시간을 쉽게 할 수 있다는 것입니까? 또는 특정 시간 간격으로 손을 돌리는 과정에서 많은 논리가 있어야합니까? 당신 같은

+0

FYI [Joda-Time] (http://www.joda.org/joda-time/) 프로젝트는 현재 [유지 관리 모드] (https://en.wikipedia.org/wiki/Maintenance_mode)에 있습니다. 팀은 [java.time] (http://docs.oracle.com/javase/9/docs/api/java/time/package-summary.html) 클래스로 마이그레이션하도록 조언했습니다. [Tutorial by Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html)을 참조하십시오. 또한 * ThreeTen-Extra * 라이브러리가이 문제를 해결하는 데 도움이 될 수 있습니다. –

답변

2

이것은 내가하고 결국 무엇인가, 나는 충분히 영리하지 않았다 사람이 더 우아한 해결책이 알려 경우,

/** 
* Reset Joda DateTime by normalize it back to the beginning of the period 
*/ 
static DateTime resetDate(BaseSingleFieldPeriod period, 
           DateTime date) { 
    LocalDate out = new LocalDate(date) 
    switch (period) { 
     case Years.ONE: 
      out = out.withMonthOfYear(1).withDayOfMonth(1) 
      break; 
     case Months.ONE: 
      out = out.withDayOfMonth(1) 
      break; 
     case Weeks.ONE: 
      // adjust day of week because Joda uses ISO standard Monday 
      // as start of the week 
      out = out.withDayOfWeek(1).minusDays(1) 
      break; 
     case Days.ONE: 
      // nothing to for days as we have already removed time by 
      // converting to local date 
      break; 
     default: 
      throw new UnsupportedOperationException("Unsupported period $period") 
    } 

    // convert to date minute to avoid giving specific time 
    out.toDateMidnight().toDateTime() 
} 

을 case 문을 피하기 위해,하지만 다행히 나는 기간 유형의 소량을 사용하여, 그래서 내가 생각했던대로는 거대한 아니었다 .

0

Soounds은 간격이 필요합니다 http://joda-time.sourceforge.net/apidocs/org/joda/time/Interval.html

을 그리고 minusdays 방법을 사용합니다. (예 쉽게, 아주 많이 그래서 바닐라 자바 ​​날짜/달력에 비해)

하루의 시간을 얻으려면이 :

int hour = dt.getHourOfDay(); 
int min = dt.getMinuteOfHour(); 
int sec = dt.getSecondOfMinute(); 
+0

그래서 나는 그 간격을 굴려야 만 하는가? 아니면 이것을 촉진하기 위해 무언가가 내장되어 있는가? –

+0

과거에 n 일을 생성하기가 쉽다. 내 편집 minusDays를 참조 ... – NimChimpsky

+0

그래, 나는 지금 저를위한 간격을 생성하는 방법을 가지고 있습니다. 단지 싫은 점은 각 기간마다 특정 논리를 가져야한다는 것입니다. 마지막 마침표와 now() 사이의 간격을 만들 수 있습니다. –

관련 문제