2013-09-27 2 views
1

이미 이것에 대한 (추한) 코드를 작동해야하지만 어쨌든 물을 것이다 :C++ 연산은

을 내가 시간 간격 [9시 15분, 10:00), [21시 10분, 21이 : 45). 시간이 t이고 초 수가 인 경우 t이 간격 내에 있으면 t - s이 속하는 날짜와 시간을 계산해야합니다.

  • 예 : t = 20130913 21:15, s = 600, t-s는 20130913 09:55에 해당합니다.
  • 예 : t = 20130923 09:16, s = 120, t-s는 20130920 21:44에 해당합니다.

는 C++ 깨끗하게에서이 일을하는 방법이 있나요 (부스트 : ICL은? 부스트 : DATE_TIME을?)

내가 부스트 :: ICL을 시도, 그것은 확실히 시간이 interval_set<Time>의 범위를 저장할 수 어떤 Time이 어떤 간격인지 찾아야하지만 t - s 시간 간격이 간격 범위에 속하지 않으면 그 시점 이전에 가장 가까운 간격을 찾을 수있는 방법을 알지 못합니다. 하루 또는 전체 주말을 통해.

+0

't = 20130915 21:15'및 's = 3300' (55 분)에 대한 결과는 무엇입니까? 나는'20130914 21 : 40'을 의심합니다. 권리? 또한이 두 가지가 유일한 간격입니까, 아니면 일반적으로 간격의 목록입니까? – nickie

+0

@nickie 현재, 각 요일 내에 단지 두 개의 간격이 있습니다. 물론 깨끗한 코드는 더 많은 것을 허용합니다. 나는 주말을 건너 뛰는 것을 잊었다 (15 일 일요일이었다). 예가 업데이트되었습니다. 평일 인 경우 15 일이 맞았습니다. – nurettin

+0

내 코드에서는 모든 간격에 대해 초를 합한 다음 몇 번의 간격을 건너 뛰었는지 확인하기 위해 추한 계산을 수행 한 다음 되돌릴 필요가있는 일 수를 계산 한 다음 얼마나 많은 주말을 찾았는지 확인합니다. 버킷. – nurettin

답변

2

나는 "깨끗한"나의 정의에 따라 해결책을 허용하기에는 문제가 너무 복잡하다고 생각한다.

당신은, 당신의 (비) 중복 매일 간격에 대한 용기를 필요로 효율적으로 다음과 같은 작업을 지원합니다 :

  • 이동 간격 뒤쪽으로 특정 간격이 일정 시간이 속하는 발견하는
    • , 컨테이너에, 그리고
    • 시간 간격으로 (시간순으로) 이동하십시오.

    boost::icl::interval_set<Time>은 적절한 해결책입니다. 당신의 시간은 날짜를 추적 할 필요가 없습니다, 당신은 그것을 별도로 가질 수 있습니다.

    귀하의 알고리즘이 될 것입니다 뭔가 같은 :

    let d and t be the date and time portions of your t 
    let i be the interval where t belongs 
    loop 
        if t-s belongs in i then 
         return t-s on day d 
        else 
         let j be the previous interval from i 
         if j does not exist (because i was the first) then 
         let j be the last interval 
         move d one weekday backwards 
         s := s - (t-start(i)) 
         t := end(j) 
         i := j 
    

    이것은 더 많거나 적은 당신이 당신의 코드가하는 말. 나는 그것이 훨씬 더 청결 할 수 있다고 생각하지 않는다.

  • +0

    이것은 반복적으로 작업을 수행하는 방법에 대한 아주 좋은 요약입니다. 나는 현재 간격을 실제 간격으로 처리하는 것을 고려 중이다. – nurettin

    관련 문제