Joda-Time: อะไรคือความแตกต่างระหว่าง Period, Interval และ Duration?


192

ในJoda-Time 2 ความแตกต่างระหว่างช่วงเวลาสามประเภทคืออะไร:

  • ระยะเวลา
  • ระยะห่าง
  • ระยะเวลา

    1. ทำไมเราต้องเรียนสามวิชา?

    2. อันไหนดีกว่ากัน?

    3. เหตุใดการแบ่งอินสแตนซ์ช่วงเวลาหรือช่วงเวลาหรือช่วงเวลาจึงไม่ถูกนำไปใช้ เช่นp = p.divideBy(2);


3
โปรดทราบว่าคำศัพท์เวลาวันที่นี้ยังไม่ได้รับมาตรฐาน (ยัง) ISO-8601ความคิดมาตรฐานของระยะเวลาคือสิ่งที่ Joda Periodเวลาพิจารณา มีการยกข้อเสนอเพื่อสร้างมาตรฐานคำศัพท์ดังกล่าว แต่ยังไม่สำเร็จ
Basil Bourque

คำตอบ:


246

จำเป็นต้องใช้คลาส 3 คลาสเนื่องจากเป็นแนวคิดที่แตกต่างกันดังนั้นจึงเป็นเรื่องของการเลือกสิ่งที่เหมาะสมสำหรับงานแทนที่จะเป็นงานที่สัมพันธ์กัน จากเอกสารที่มีความคิดเห็นเพิ่มโดยฉันเป็นตัวเอียง :


ช่วงเวลาใน Joda เวลาหมายถึงช่วงเวลาจากที่หนึ่งมิลลิวินาทีฉับพลันได้อีก อินสแตนซ์ทั้งคู่เป็นอินสแตนซ์ที่ระบุอย่างครบถ้วนใน datetime continuum พร้อมด้วยเขตเวลา เวลาที่ระบุถูกกำหนดไว้เช่นนี้อาจเป็นช่วงเวลาระหว่าง 20: 00: 00GMT เมื่อวานนี้และเวลา 09: 00: 00GMT ในเช้านี้

ระยะเวลาใน Joda เวลาหมายถึงระยะเวลาของเวลาที่วัดเป็นมิลลิวินาที ระยะเวลามักจะได้รับจากช่วงเวลา นั่นคือเราสามารถลบเริ่มต้นจากจุดสิ้นสุดของช่วงเวลาเพื่อหาช่วงเวลา

ระยะเวลาใน Joda เวลาหมายถึงระยะเวลาของเวลาที่กำหนดไว้ในแง่ของสาขาเช่น 3 ปี 5 เดือน 2 วัน 7 ชั่วโมง สิ่งนี้แตกต่างจากช่วงเวลาที่ไม่แน่นอนในแง่ของมิลลิวินาที ช่วงเวลาสามารถแก้ไขเป็นจำนวนมิลลิวินาทีที่แน่นอนเท่านั้นโดยการระบุทันที (รวมถึงเหตุการณ์และโซนเวลา) ที่สัมพันธ์กับ เช่นพิจารณาระยะเวลา 1 ปีหากเราเพิ่มสิ่งนี้ลงในวันที่ 1 มกราคมเราจะมาถึงในวันที่ 1 มกราคมถัดไป แต่ระยะเวลาจะขึ้นอยู่กับว่าปีที่เข้าแทรกแซงนั้นเป็นปีอธิกสุรทินหรือไม่ ในทำนองเดียวกันหากเราเพิ่ม 1 เดือนไปยังวันที่ 1 ของเดือนเราจะมาถึงที่ 1 ของเดือนถัดไป แต่ระยะเวลา (เป็นมิลลิวินาที) จะแตกต่างกันไปตามเดือนที่มีปัญหา


สำหรับคำถามที่ 3 ไม่จำเป็นต้องใช้วิธีการเฉพาะในการแบ่งช่วงเวลาเพราะเราสามารถรับจำนวนมิลลิวินาทีจากระยะเวลาในแบบ a long(โดยใช้getMillis()) หารและสร้างช่วงเวลาใหม่ (โดยใช้new Duration(long duration))

การแบ่งช่วงเวลาไม่มีความหมายที่แท้จริงตามคำจำกัดความของช่วงเวลาด้านบน เช่นครึ่งเดือนคืออะไร (ความยาวของมันจะขึ้นอยู่กับเดือนใด)


1
ฉันคิดว่าการแบ่งช่วงเวลามีความหมาย - ครึ่งเดือนยังคงเป็นหน่วยเวลาที่ถูกต้อง แต่ต้องมีวันที่เริ่มต้นเพื่อให้รู้ว่าระยะเวลาเท่าใด (ในลักษณะเดียวกับเดือนคือช่วงเวลาที่ถูกต้อง)
hadley

11
Jodatime พิจารณาว่าระยะเวลาเป็น tuple ของเขตข้อมูลที่มีค่า INTEGER แต่ไม่อนุญาตให้มีค่าเศษส่วน ที่สอดคล้องกับการใช้งานทั่วไป (โยธา) แทบไม่มีใครในชีวิตร่วมคิดว่า '1 เดือนและ 10 วัน' หารด้วยสองคือ 'ครึ่งเดือนและ 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)

ตามช่วงเวลาI1และI2แตกต่างกันเพราะจุดสิ้นสุดแตกต่างกัน แต่ถ้าฉันแปลงมันเป็นระยะเวลาฉันจะได้สิ่งนั้นเหมือนกัน: 3600000 milliseconds.

(เปรียบเทียบคณิตศาสตร์: ช่วงเวลา[10,12]และ[95,97]มีความแตกต่างช่วงเวลาแต่พวกเขามีเหมือนกันความยาว : "ความยาวช่วง"แมปกับระยะเวลา )

ในที่สุดช่วงเวลาก็ล่วงเลยไปของ "เวลาพลเรือน" ซึ่งแสดงเป็นจำนวนเดือนวันชั่วโมง ฯลฯ มันไม่ได้ - โดยตัวเอง - แทนช่วงเวลา "ทางกายภาพ" ดังนั้นจึงไม่สามารถแปลงเป็นระยะเวลา (เดือนมีความยาวแปรผัน ... )

คำตอบนี้ตอบคำถามที่ 3: คุณสามารถหารด้วยเวลาทางกายภาพได้สองครั้งเท่านั้น (ระยะเวลา)


สี่เดือนหารด้วยสองจะเป็นสองเดือน เหตุใดจึงไม่ถูกต้อง
hadley

1
คุณจะคำนวณ '2 เดือนอย่างไร 18 วันหารด้วย 3? คุณไม่สามารถรับคำจำกัดความที่สอดคล้องกับประเภทของการดำเนินงานที่
leonbloy

3
ฉันคิดว่าคุณจะได้คำจำกัดความที่สอดคล้องกัน แต่คุณต้องคิดเป็น 1/3 ของเวลา "2 เดือนและ 18 วัน" คุณจะไม่สามารถทำงานให้ถูกต้องได้จนกว่าคุณจะแปลงเป็นช่วงเวลา เพียงเพราะ JODA ไม่สนับสนุนไม่ได้หมายความว่าไม่ถูกต้อง
hadley

@hadley ไม่มีคำจำกัดความทางแพ่งสำหรับ "หนึ่งในสามของวัน" เช่นไม่มีสัญญาที่ถูกต้องเป็นเวลาหนึ่งในสามของวัน
ipavlic

4
@Richard Watson Days สามารถยาว 23, 24 หรือ 25 ชั่วโมงเนื่องจาก DST ดังนั้น "หนึ่งในสามของวันเริ่มต้นจาก ... " จึงใช้ได้ แต่เพียง "หนึ่งในสาม" ไม่
ipavlic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.