Joda-Time: sự khác biệt giữa Thời gian, Khoảng thời gian và Thời lượng là gì?


192

Trong Joda-Time 2, sự khác biệt giữa ba loại khoảng thời gian là gì:

  • Giai đoạn = Stage
  • Khoảng
  • Thời lượng

    1. Tại sao chúng ta cần ba lớp?

    2. Cái nào thực hiện tốt hơn?

    3. Tại sao việc phân chia một giai đoạn hoặc Thời lượng hoặc thời gian Interval không được thực hiện? Ví dụp = p.divideBy(2);


3
Lưu ý rằng thuật ngữ ngày giờ này chưa được chuẩn hóa (chưa). Các tiêu chuẩn ISO-8601 ý tưởng tiêu chuẩn của một thời gian là những gì Joda thời gian xem xét một Period. Một đề xuất tiêu chuẩn hóa thuật ngữ như vậy đã được nêu ra nhưng chưa được thực hiện.
Basil Bourque

Câu trả lời:


246

3 lớp là cần thiết bởi vì chúng đại diện cho các khái niệm khác nhau, vì vậy vấn đề là chọn một lớp phù hợp cho công việc thay vì hiệu suất tương đối. Từ các tài liệu với ý kiến ​​được thêm bởi tôi in nghiêng :


Một khoảng thời gian trong Joda-Time biểu thị một khoảng thời gian từ một phần nghìn giây tức thời đến một tức thời khác. Cả hai instants đều được chỉ định đầy đủ các instants trong liên tục datetime, hoàn thành với múi giờ. Thời gian cụ thể được xác định, ví dụ: đây có thể là khoảng thời gian giữa 20: 00: 00GMT ngày hôm qua và 09: 00: 00GMT sáng nay.

Một thời gian trong Joda thời gian đại diện cho một quãng thời gian đo bằng mili giây. Thời lượng thường thu được từ một khoảng. tức là chúng ta có thể trừ bắt đầu từ cuối một khoảng để rút ra thời lượng

Một khoảng thời gian trong Joda-Time biểu thị một khoảng thời gian được xác định theo các lĩnh vực, ví dụ: 3 năm 5 tháng 2 ngày và 7 giờ. Điều này khác với thời lượng ở chỗ nó không chính xác về mặt mili giây. Một khoảng thời gian chỉ có thể được giải quyết đến một số mili giây chính xác bằng cách chỉ định tức thời (bao gồm cả niên đại và múi giờ) mà nó có liên quan. ví dụ: xem xét khoảng thời gian 1 năm, nếu chúng tôi thêm vào ngày 1 tháng 1, chúng tôi sẽ luôn đến vào ngày 1 tháng 1 tới nhưng thời gian sẽ phụ thuộc vào năm can thiệp có phải là năm nhuận hay không. Tương tự như vậy nếu chúng ta thêm 1 tháng vào ngày đầu tiên của tháng thì chúng ta sẽ đến vào ngày đầu tiên của tháng tiếp theo nhưng thời lượng (tính bằng mili giây) sẽ thay đổi tùy theo tháng được đề cập


Đối với câu hỏi 3, Phương pháp cụ thể để phân chia thời lượng là không thực sự cần thiết bởi vì chúng ta luôn có thể lấy số mili giây từ thời lượng dưới dạng long(sử dụng getMillis()), chia nó và xây dựng thời lượng mới (sử dụng new Duration(long duration)).

Chia một giai đoạn không thực sự có ý nghĩa thực sự dựa trên định nghĩa của một giai đoạn trên. ví dụ nửa tháng là gì? (độ dài của nó sẽ phụ thuộc vào tháng nào).


1
Tôi nghĩ rằng việc chia một khoảng thời gian có ý nghĩa - nửa tháng vẫn là một đơn vị thời gian hợp lệ, nhưng nó đòi hỏi một ngày bắt đầu để biết chính xác thời gian (theo cách chính xác một tháng là một khoảng thời gian hợp lệ).
hadley

11
Jodatime coi một giai đoạn là một bộ các trường có giá trị INTEGER, nó không cho phép các giá trị phân số. Điều đó phù hợp với việc sử dụng phổ biến (dân sự). Thực tế không ai trong cuộc sống chung coi rằng '1 tháng và 10 ngày' chia cho hai là 'nửa tháng và 5 ngày'. Nếu bạn cần thực hiện phân chia đó, có lẽ bạn muốn đi đến một khoảng thời gian (thời gian vật lý).
leonbloy

90

Để thêm vào câu trả lời của mikej :

Một khoảng thời gian Joda là "vật lý"; ví dụ:

12000 milliseconds <- đây là một khoảng thời gian

Một Joda-Time interval thực sự là một cặp khoảnh khắc (bắt đầu ngay lập tức - end ngay lập tức). Một tức là, một lần nữa, một "vật lý" khái niệm, một điểm trong thời gian. Ví dụ (chỉ là một ký hiệu có thể):

(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC) <- đây là một khoảng

Một khoảng thời gian , sau đó, có thể được chuyển đổi thành một khoảng thời gian , nhưng không phải là ngược lại.

Hãy xem xét hai khoảng thời gian này:

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)

Như các khoảng, I1I2khác nhau, bởi vì các điểm cuối là khác nhau; nhưng nếu tôi chuyển đổi chúng thành thời lượng, tôi sẽ nhận được điều tương tự:3600000 milliseconds .

(Tương tự toán học: các khoảng [10,12][95,97]là các khoảng khác nhau , nhưng chúng có cùng độ dài : ánh xạ "độ dài khoảng" theo thời lượng ).

Cuối cùng, một khoảng thời gian là một khoảng thời gian của "thời gian dân sự", được biểu thị bằng một số tháng, ngày, giờ, v.v. thời lượng (tháng có độ dài thay đổi ...).

Câu trả lời này cho câu hỏi 3: bạn chỉ có thể chia cho hai thời gian vật lý (thời lượng).


Bốn tháng chia cho hai sẽ là hai tháng. Tại sao điều đó không hợp lệ?
hadley

1
Làm thế nào bạn sẽ tính toán '2 tháng; 18 ngày chia cho 3? Bạn không thể có được một định nghĩa nhất quán cho loại hoạt động đó.
leonbloy

3
Tôi nghĩ rằng bạn có thể có được một định nghĩa nhất quán, nhưng bạn phải nghĩ về nó như là 1/3 thời gian của "2 tháng và 18 ngày". Bạn sẽ không thể tìm ra chính xác nó là gì cho đến khi bạn chuyển đổi nó thành một khoảng. Chỉ vì JODA không hỗ trợ nên không có nghĩa là nó không hợp lệ.
hadley

@hadley Không có định nghĩa dân sự cho "một phần ba ngày". Ví dụ, không có hợp đồng có hiệu lực trong một phần ba của một ngày.
ipavlic

4
@Richard Watson Ngày có thể kéo dài 23, 24 hoặc 25 giờ, vì DST. Do đó "một phần ba của một ngày bắt đầu từ ..." là hợp lệ, nhưng chỉ "một phần ba" thì không.
ipavlic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.