TL; DR
แปลงล้าสมัยของวัตถุที่จะทดแทนของพวกเขาjava.util.Date
แล้วคำนวณเวลาที่ผ่านไปเป็นjava.time.Instant
Duration
Duration d =
Duration.between( // Calculate the span of time between two moments as a number of hours, minutes, and seconds.
myJavaUtilDate.toInstant() , // Convert legacy class to modern class by calling new method added to the old class.
Instant.now() // Capture the current moment in UTC. About two and a half hours later in this example.
)
;
d.toString (): PT2H34M56S
d.toMinutes (): 154
d.toMinutesPart (): 34
รูปแบบ ISO 8601: PnYnMnDTnHnMnS
สมเหตุสมผลมาตรฐานISO 8601กำหนดเป็นตัวแทนกระชับต้นฉบับเดิมของช่วงเวลาที่เป็นตัวเลขของปีเดือนวันชั่วโมง ฯลฯ มาตรฐานสายดังกล่าวคืบดังกล่าวเป็นระยะเวลา รูปแบบคือPnYnMnDTnHnMnS
ที่P
หมายถึง "ระยะเวลา" ส่วนที่T
แยกวันที่จากส่วนเวลาและในระหว่างนั้นเป็นตัวเลขตามด้วยตัวอักษร
ตัวอย่าง:
P3Y6M4DT12H30M5S
สามปีหกเดือนสี่วันสิบสองชั่วโมงสามสิบนาทีและห้าวินาที
PT4H30M
สี่ชั่วโมงครึ่ง
java.time
java.timeกรอบที่สร้างขึ้นใน Java 8 และต่อมา supplants ลำบากเก่าjava.util.Date
/ java.util.Calendar
ชั้นเรียน คลาสใหม่นี้ได้รับแรงบันดาลใจจากกรอบการทำงานของJoda-Time ที่ประสบความสำเร็จอย่างสูงซึ่งมีจุดประสงค์เพื่อเป็นตัวตายตัวแทนซึ่งคล้ายกับแนวคิด แต่ได้รับการออกแบบใหม่ กำหนดโดยJSR 310 ขยายโดยThreeTen-พิเศษโครงการ ดูการสอน
ขณะ
Instant
ชั้นหมายถึงช่วงเวลาบนไทม์ไลน์ในส่วนUTCมีความละเอียดของนาโนวินาที (ถึงเก้า (9) ตัวเลขของส่วนทศนิยม)
Instant instant = Instant.now() ; // Capture current moment in UTC.
ที่ดีที่สุดเพื่อหลีกเลี่ยงการเรียนแบบเดิมเช่น/Date
Calendar
แต่ถ้าคุณต้องทำงานร่วมกับรหัสเก่าที่ยังไม่ได้อัปเดตเป็นjava.timeให้แปลงไปมา เรียกวิธีการแปลงใหม่ที่เพิ่มในคลาสเก่า สำหรับการย้ายจากjava.util.Date
ไปยังโทรInstant
Date::toInstant
Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy `java.util.Date` class to modern `java.time.Instant` class.
ช่วงเวลา
คลาส java.time ได้แบ่งแนวคิดนี้ในการแสดงช่วงเวลาเป็นจำนวนปี, เดือน, วัน, ชั่วโมง, นาที, วินาทีเป็นสองส่วน:
นี่คือตัวอย่าง
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
ZonedDateTime future = now.plusMinutes ( 63 );
Duration duration = Duration.between ( now , future );
ถ่ายโอนข้อมูลไปยังคอนโซล
ทั้งสองPeriod
และDuration
ใช้มาตรฐาน ISO 8601สำหรับการสร้างการแสดงสตริงของค่าของพวกเขา
System.out.println ( "now: " + now + " to future: " + now + " = " + duration );
ตอนนี้: 2015-11-26T00: 46: 48.016-05: 00 [อเมริกา / มอนทรีออล] ถึงอนาคต: 2015-11-26T00: 46: 48.016-05: 00 [อเมริกา / มอนทรีออล] = PT1H3M
Java 9 เพิ่มวิธีการเพื่อDuration
ให้ได้ส่วนวันส่วนชั่วโมงส่วนนาทีและส่วนวินาที
คุณสามารถรับจำนวนวันหรือชั่วโมงหรือนาทีหรือวินาทีหรือวินาทีหรือมิลลิวินาทีหรือ nanoseconds ในระยะเวลาทั้งหมด
long totalHours = duration.toHours();
ใน Java 9 Duration
คลาสจะได้รับวิธีการใหม่ในการคืนส่วนต่าง ๆ ของวันชั่วโมงนาทีวินาทีวินาทีมิลลิวินาที / นาโนวินาที เรียกto…Part
วิธีการ: toDaysPart()
, toHoursPart()
และอื่น ๆ
ChronoUnit
หากคุณสนใจว่าจะมีเวลามากขึ้นอย่างง่ายเช่น "จำนวนวันที่ผ่านไป" ให้ใช้ChronoUnit
enum
long daysElapsed = ChronoUnit.DAYS.between( earlier , later );
ตัวอย่างอื่น.
Instant now = Instant.now();
Instant later = now.plus( Duration.ofHours( 2 ) );
…
long minutesElapsed = ChronoUnit.MINUTES.between( now , later );
120
เกี่ยวกับ java.time
java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date
, และCalendar
SimpleDateFormat
Joda เวลาโครงการขณะนี้อยู่ในโหมดการบำรุงรักษาให้คำแนะนำแก่การโยกย้ายไปยัง java.time
ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปกJSR 310
จะรับคลาส java.time ได้ที่ไหน?
- Java SE 8และ SE 9และใหม่กว่า
- Built-in
- เป็นส่วนหนึ่งของ Java API มาตรฐานที่มีการใช้งานแบบรวม
- Java 9 เพิ่มคุณสมบัติและการแก้ไขเล็กน้อย
- Java SE 6และ SE 7
- มากของการทำงาน java.time จะกลับรังเพลิง Java 6 และ 7 ในThreeTen-ย้ายกลับ
- Android
โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โครงการนี้เป็นพื้นฐานที่พิสูจน์ได้สำหรับการเพิ่มเติมในอนาคตไปยัง java.time คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval
, YearWeek
, YearQuarter
และอื่น ๆ อีกมากมาย
Joda เวลา
UPDATE: โครงการJoda-Timeอยู่ในโหมดบำรุงรักษาโดยทีมงานจะแนะนำการย้ายไปยังคลาสjava.time ฉันจะปล่อยให้ส่วนนี้ไม่เสียหายสำหรับประวัติ
ไลบรารี Joda-Time ใช้ ISO 8601 เป็นค่าเริ่มต้น มันPeriod
จะแยกวิเคราะห์ระดับและสร้างเหล่านี้สตริง PnYnMnDTnHnMnS
DateTime now = DateTime.now(); // Caveat: Ignoring the important issue of time zones.
Period period = new Period( now, now.plusHours( 4 ).plusMinutes( 30));
System.out.println( "period: " + period );
วาทกรรม:
period: PT4H30M