Joda-Time : 기간, 간격 및 기간의 차이점은 무엇입니까?


192

에서는 Joda 타임 2 시간 범위의 3 종류의 차이는 무엇인가

  • 기간
  • 간격
  • 지속

    1. 왜 우리는 세 개의 수업이 필요합니까?

    2. 어느 쪽이 더 잘 수행됩니까?

    3. 기간 또는 기간 또는 간격 인스턴스 나누기 가 구현되지 않은 이유는 무엇 입니까? 예 :p = p.divideBy(2);


3
이 날짜-시간 용어는 아직 표준화되지 않았습니다. 지속 시간에 대한 ISO-8601 표준의 아이디어는 Joda-Time이 고려하는 것 입니다. 이러한 용어를 표준화하기위한 제안이 제기되었지만 아직 달성되지는 않았습니다. Period
Basil Bourque

답변:


246

3 개의 클래스는 서로 다른 개념을 나타 내기 때문에 필요합니다. 따라서 상대적인 성능보다는 작업에 적합한 클래스를 선택해야합니다. 로부터 문서 에 나를 추가 의견 이탤릭체 :


간격 Joda 타임 다른 순간에 1 밀리 즉석에서 시간 간격을 나타낸다. 두 인스턴트는 모두 날짜 및 시간 연속체로 완전히 지정된 인스턴트이며 시간대와 함께 완료됩니다. 특정 시간이 정의됩니다. 예를 들어 어제 오전 20 : 00 : 00GMT와 오늘 오전 09 : 00 : 00GMT 사이의 간격 일 수 있습니다.

기간 Joda 타임은 밀리 초 단위로 측정 시간의 지속 시간을 나타냅니다. 지속 시간은 종종 간격에서 얻습니다. 즉, 구간 끝에서 시작을 빼서 기간을 도출 할 수 있습니다.

기간 Joda 타임은 예를 들어 필드의 관점에서 정의 된 시간의 기간, 3 년 5개월 이일 7 시간을 나타냅니다. 이는 밀리 초 단위로 정확하지 않다는 점과 다릅니다. 마침표 (시간 및 시간대 포함)를 지정하여 마침표를 정확한 시간 (밀리 초)으로 만 해결할 수 있습니다. 예를 들어 1 년의 기간을 고려하십시오. 1 월 1 일에 추가하면 항상 다음 1 월 1 일에 도착하지만 기간은 중간 연도의 윤년인지 여부에 따라 달라집니다. 마찬가지로 1 개월을 1 월 1 일에 추가하면 다음 달 1 일에 도착하지만 기간 (밀리 초)은 해당 월에 따라 다릅니다.


질문 3의 경우 지속 시간을 나누는 특정 방법은 실제로 필요하지 않습니다. 왜냐하면 지속 시간에서 항상 밀리 초 수를 long(사용 getMillis())으로 가져 와서 나누고 새로운 지속 시간을 구성 할 수 있기 때문입니다 (new Duration(long duration) ).

마침표를 나누는 것은 위 마침표의 정의에 따라 실제로 의미가 없습니다. 예를 들어 반달이란 무엇입니까? (길이는 달에 따라 다름)


1
기간을 나누는 것은 의미가 있다고 생각합니다. 월 반은 여전히 ​​유효한 시간 단위이지만 시작 날짜는 정확히 얼마나 긴지를 알기 위해 필요합니다 (정확히 한 달이 유효한 기간과 동일 함).
hadley

11
Jodatime은 기간을 INTEGER 값 필드의 튜플로 간주하며 분수 값을 허용하지 않습니다. 그것은 일반적인 (민간) 사용과 일치합니다. 실제로 일상 생활에서 '1 개월과 10 일'을 2로 나눈 값이 '한 달 반과 5 일'이라고 생각하는 사람은 없습니다. 그 구분을해야한다면 아마도 지속 시간 (물리적 시간)으로 가고 싶을 것입니다.
leonbloy

90

mikej의 답변에 추가하려면 :

Joda 타임 기간 은 "실제"시간 간격, 예 :

12000 milliseconds <-이것은 지속 시간입니다

Joda-Time 간격 은 실제로 한 쌍의 인스턴트입니다 (시작 인스턴트-종료 인스턴트). 순간은 , 다시, "물리적"개념, 타임 라인에있는 지점입니다. 예 : 가능한 표기법 :

(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC) <-이것은 간격입니다

간격은 , 그런 다음에 변환 할 수있는 기간 반대를하지만.

다음 두 간격을 고려하십시오.

I1=(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC)

I2=(2010/3/3 21:00:00.000 UTC ; 2010/3/3 22:00:00.000 UTC)

끝 점이 다르기 때문에 간격 I1I2는 다릅니다. 그러나 그것들을 지속 시간으로 변환하면 같은 것을 얻습니다.3600000 milliseconds .

(수학 비유 : 간격 [10,12]과는 [95,97]다른 간격 하지만이 같은이 길이 : "구간 길이" 에 매핑 기간 ).

마지막으로, 기간 은 몇 개월, 일, 시간 등으로 표현되는 "시민 시간"의 경과입니다. "자체적으로" "물리적"간격을 나타내지 않으므로 직접적으로 변환 할 수 없습니다. 지속 (월은 가변 길이가 있습니다 ...).

이것은 질문 3에 대한 답입니다. 당신은 두 시간으로 만 나눌 수 있습니다.


4 개월을 2로 나눈 값은 2 개월입니다. 왜 유효하지 않습니까?
hadley

1
'2 개월을 어떻게 계산하겠습니까? 18 일을 3으로 나눈? 그런 종류의 작업에 대한 일관된 정의를 얻을 수 없습니다.
leonbloy

3
일관된 정의를 얻을 수 있다고 생각하지만 "2 개월 18 일"의 1/3로 생각해야합니다. 인터벌로 변환 할 때까지 정확히 무엇인지 알아낼 수 없습니다. JODA가 지원하지 않는다고해서 그것이 유효하지 않다는 것을 의미하지는 않습니다.
hadley

@hadley "하루 3 분의 1"에 대한 민사 정의는 없습니다. 예를 들어, 하루 3 분의 1의 계약은 유효하지 않습니다.
ipavlic

4
@Richard Watson Days는 DST로 인해 23, 24 또는 25 시간이 될 수 있습니다. 따라서 "...에서 시작하는 1/3"은 유효하지만 "1/3"만 유효하지 않습니다.
ipavlic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.