Joda-Time: apa perbedaan antara Periode, Interval, dan Durasi?

192

Dalam Joda-Time 2, apa perbedaan antara tiga jenis rentang waktu:

  • Titik
  • Selang
  • Durasi

    1. Mengapa kita membutuhkan tiga kelas?

    2. Mana yang berkinerja lebih baik?

    3. Mengapa membagi Periode atau Durasi atau instance Interval tidak diterapkan? Misalnyap = p.divideBy(2);

Gerard
sumber
3
Perhatikan bahwa terminologi tanggal-waktu ini belum distandarisasi (belum). The ISO-8601 gagasan standar ini dari durasi yang Joda-Time menganggap Period. Proposal untuk menstandarisasi terminologi semacam itu telah diajukan tetapi belum tercapai.
Basil Bourque

Jawaban:

246

3 kelas diperlukan karena mereka mewakili konsep yang berbeda sehingga masalah memilih yang tepat untuk pekerjaan daripada kinerja relatif. Dari dokumentasi dengan komentar yang saya tambahkan dalam huruf miring :


Sebuah selang di Joda-Time merupakan interval waktu dari satu milidetik instan ke instan lain. Kedua instance adalah instance yang ditentukan sepenuhnya dalam kontinum datetime, lengkap dengan zona waktu. Waktu spesifik ditentukan misalnya ini mungkin interval antara 20: 00: 00GMT kemarin dan 09: 00: 00GMT pagi ini.

Sebuah durasi di Joda-Time merupakan durasi waktu diukur dalam milidetik. Durasi sering diperoleh dari suatu interval. yaitu kita dapat mengurangi mulai dari akhir interval untuk mendapatkan durasi

Suatu periode dalam Joda-Time merupakan periode waktu yang didefinisikan dalam bidang, misalnya, 3 tahun 5 bulan 2 hari dan 7 jam. Ini berbeda dari durasi dalam hal itu tidak tepat dalam hal milidetik. Suatu periode hanya dapat diselesaikan dengan jumlah milidetik yang tepat dengan menetapkan instan (termasuk kronologi dan zona waktu) yang terkait dengan. mis. pertimbangkan periode 1 tahun, jika kita menambahkan ini ke 1 Januari kita akan selalu tiba pada 1 Januari berikutnya tetapi durasinya akan tergantung pada apakah tahun intervensi adalah tahun kabisat atau tidak. Demikian pula jika kita menambahkan 1 bulan ke tanggal 1 bulan maka kita akan tiba pada tanggal 1 bulan berikutnya tetapi durasinya (dalam milidetik) akan bervariasi berdasarkan bulan yang bersangkutan


Untuk pertanyaan 3, metode khusus untuk membagi durasi tidak benar-benar diperlukan karena kita selalu bisa mendapatkan jumlah milidetik dari durasi sebagai long(menggunakan getMillis()), membaginya dan membangun durasi baru (menggunakannew Duration(long duration) ).

Membagi periode tidak benar-benar memiliki makna yang nyata berdasarkan definisi periode di atas. misal berapa setengah bulan? (panjangnya akan tergantung pada bulan mana).

mikej
sumber
1
Saya pikir membagi periode memang memiliki arti - setengah bulan masih merupakan satuan waktu yang valid, tetapi membutuhkan tanggal mulai untuk mengetahui dengan tepat berapa lama (dengan cara yang persis sama satu bulan adalah periode yang valid).
hadley
11
Jodatime menganggap periode sebagai sebuah tupel dari bidang bernilai INTEGER, itu tidak memungkinkan nilai fraksional. Itu konsisten dengan penggunaan umum (sipil). Praktis tidak seorang pun dalam kehidupan sehari-hari menganggap bahwa '1 bulan dan 10 hari' dibagi dua adalah 'setengah bulan dan 5 hari'. Jika Anda perlu melakukan pembagian itu, Anda mungkin ingin pergi ke durasi (waktu fisik).
leonbloy
90

Untuk menambah jawaban mikej :

Sebuah Joda-Time durasi adalah interval waktu "fisik"; misalnya:

12000 milliseconds <- ini adalah durasi

Interval Joda-Time sebenarnya adalah sepasang instance (mulai instan - akhir instan). Sebuah instan , sekali lagi, konsep "fisik", titik di timeline. Misalnya (hanya notasi yang mungkin):

(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC) <- ini adalah interval

Sebuah selang , kemudian, dapat dikonversi ke durasi , tetapi tidak sebaliknya.

Pertimbangkan dua interval ini:

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)

Sebagai interval, I1dan I2berbeda, karena titik akhir berbeda; tetapi jika aku mengkonversikannya ke durasi, saya mendapatkan hal yang sama: 3600000 milliseconds.

(Analogi Math: interval [10,12]dan [95,97]berbeda interval , tetapi mereka memiliki sama panjang : "panjang interval" peta untuk durasi ).

Akhirnya, suatu periode adalah selang dari "waktu sipil", dinyatakan sebagai sejumlah bulan, hari, jam, dll. Itu tidak -dengan sendirinya- mewakili interval "fisik", oleh karena itu tidak dapat secara langsung dikonversi menjadi durasi (bulan memiliki panjang variabel ...).

Ini menjawab pertanyaan 3: Anda hanya dapat membagi dua waktu fisik (satu durasi).

leonbloy
sumber
Empat bulan dibagi dua akan menjadi dua bulan. Mengapa itu tidak valid?
hadley
1
Bagaimana Anda menghitung '2 Bulan; 18 hari dibagi 3? Anda tidak dapat memperoleh definisi yang konsisten untuk operasi semacam itu.
leonbloy
3
Saya pikir Anda bisa mendapatkan definisi yang konsisten, tetapi Anda harus menganggapnya sebagai 1/3 dari waktu "2 bulan dan 18 hari". Anda tidak akan bisa mengetahui persis apa itu sampai Anda mengubahnya menjadi interval. Hanya karena JODA tidak mendukung itu tidak berarti itu tidak valid.
hadley
@adley Tidak ada definisi sipil untuk "sepertiga dari sehari". Misalnya, tidak ada kontrak yang berlaku untuk sepertiga hari.
ipavlic
4
@Richard Watson Days dapat berlangsung 23, 24 atau 25 jam, karena DST. Oleh karena itu "sepertiga dari hari mulai dari ..." valid, tetapi hanya "sepertiga" tidak.
ipavlic