Joda เวลา
สำหรับการเพิ่มการพึ่งพาฉันเกรงว่า java.util.Date & .Calendar นั้นแย่มากที่สิ่งแรกที่ฉันทำกับโปรเจ็กต์ใหม่คือการเพิ่มห้องสมุด Joda-Time ใน Java 8 คุณสามารถใช้แพ็คเกจ java.time ใหม่ซึ่งได้แรงบันดาลใจจาก Joda-Time
แก่นแท้ของ Joda-Time คือDateTime
คลาส ซึ่งแตกต่างจาก java.util.Date จะเข้าใจเขตเวลาที่กำหนด ( DateTimeZone
) เมื่อแปลงจาก juDate ให้กำหนดโซน
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTimeQuébec = new DateTime( date , zone );
LocalDate
วิธีหนึ่งในการตรวจสอบว่าที่ดินลงวันที่สองครั้งในวันเดียวกันคือการแปลงเป็นLocalDate
วัตถุ
การแปลงนั้นขึ้นอยู่กับเขตเวลาที่กำหนด เพื่อเปรียบเทียบLocalDate
วัตถุพวกเขาจะต้องถูกแปลงด้วยโซนเดียวกัน
นี่คือวิธีการอรรถประโยชน์เล็กน้อย
static public Boolean sameDate ( DateTime dt1 , DateTime dt2 )
{
LocalDate ld1 = new LocalDate( dt1 );
// LocalDate determination depends on the time zone.
// So be sure the date-time values are adjusted to the same time zone.
LocalDate ld2 = new LocalDate( dt2.withZone( dt1.getZone() ) );
Boolean match = ld1.equals( ld2 );
return match;
}
ดีกว่าจะเป็นอาร์กิวเมนต์อื่นโดยระบุเขตเวลาแทนการสมมติว่าควรใช้เขตเวลาของวัตถุ DateTime เป็นครั้งแรก
static public Boolean sameDate ( DateTimeZone zone , DateTime dt1 , DateTime dt2 )
{
LocalDate ld1 = new LocalDate( dt1.withZone( zone ) );
// LocalDate determination depends on the time zone.
// So be sure the date-time values are adjusted to the same time zone.
LocalDate ld2 = new LocalDate( dt2.withZone( zone ) );
return ld1.equals( ld2 );
}
การเป็นตัวแทนสตริง
อีกวิธีหนึ่งคือการสร้างการแสดงสตริงของส่วนวันที่ของแต่ละวันที่แล้วเปรียบเทียบสตริง
อีกครั้งเขตเวลาที่กำหนดเป็นสิ่งสำคัญ
DateTimeFormatter formatter = ISODateTimeFormat.date(); // Static method.
String s1 = formatter.print( dateTime1 );
String s2 = formatter.print( dateTime2.withZone( dt1.getZone() ) );
Boolean match = s1.equals( s2 );
return match;
ช่วงเวลา
โซลูชันทั่วไปคือการกำหนดช่วงเวลาจากนั้นถามว่าช่วงเวลามีเป้าหมายของคุณหรือไม่ โค้ดตัวอย่างนี้อยู่ใน Joda-Time 2.4 โปรดทราบว่าคลาสที่เกี่ยวข้องกับ "เที่ยงคืน" จะถูกคัดค้าน ใช้withTimeAtStartOfDay
วิธีการแทน Joda-Time เสนอสามคลาสเพื่อแสดงช่วงเวลาในรูปแบบต่างๆ: ช่วงเวลาช่วงเวลาและระยะเวลา
ใช้วิธี "Half-Open" โดยที่จุดเริ่มต้นของการรวมรวมและสิ้นสุดเฉพาะ
เขตเวลาของเป้าหมายอาจแตกต่างจากเขตเวลาของช่วงเวลา
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime target = new DateTime( 2012, 3, 4, 5, 6, 7, timeZone );
DateTime start = DateTime.now( timeZone ).withTimeAtStartOfDay();
DateTime stop = start.plusDays( 1 ).withTimeAtStartOfDay();
Interval interval = new Interval( start, stop );
boolean containsTarget = interval.contains( target );
java.time
Java 8 และใหม่กว่ามาพร้อมกับเฟรมเวิร์กjava.time แรงบันดาลใจจาก Joda-Time ที่กำหนดโดย JSR 310 และขยายโดยโครงการ ThreeTen-Extra ดูการสอน
ผู้สร้าง Joda-Time ได้สั่งให้พวกเราทุกคนย้ายไปที่ java.time ทันทีที่สะดวก ในขณะเดียวกัน Joda-Time ยังคงดำเนินต่อไปในฐานะโครงการที่ได้รับการบำรุงรักษาอย่างแข็งขัน แต่คาดว่างานในอนาคตจะเกิดขึ้นเฉพาะใน java.time และ ThreeTen-Extra มากกว่า Joda-Time
เพื่อสรุป java.time โดยย่อ… Instant
เป็นช่วงเวลาหนึ่งในไทม์ไลน์ใน UTC ใช้เขตเวลา ( ZoneId
) เพื่อรับZonedDateTime
วัตถุ ที่จะย้ายออกจากระยะเวลาที่จะได้รับความคิดที่ไม่แน่นอนคลุมเครือของวันที่เวลาใช้เรียน "ท้องถิ่น": LocalDateTime
, ,LocalDate
LocalTime
ตรรกะที่กล่าวถึงในส่วน Joda-Time ของคำตอบนี้ใช้กับ java.time
คลาส java.util.Date เก่ามีtoInstant
วิธีการใหม่สำหรับการแปลงเป็น java.time
Instant instant = yourJavaUtilDate.toInstant(); // Convert into java.time type.
การกำหนดวันที่ต้องใช้เขตเวลา
ZoneId zoneId = ZoneId.of( "America/Montreal" );
เราใช้ว่าวัตถุโซนเวลาที่จะได้รับInstant
ZonedDateTime
จากนั้นเราแยกค่าวันที่อย่างเดียว (a LocalDate
) ตามเป้าหมายของเราคือการเปรียบเทียบวันที่ (ไม่ใช่ชั่วโมงนาที ฯลฯ )
ZonedDateTime zdt1 = ZonedDateTime.ofInstant( instant , zoneId );
LocalDate localDate1 = LocalDate.from( zdt1 );
ทำสิ่งเดียวกันกับjava.util.Date
วัตถุที่สองที่เราต้องการเปรียบเทียบ ฉันจะใช้ช่วงเวลาปัจจุบันแทน
ZonedDateTime zdt2 = ZonedDateTime.now( zoneId );
LocalDate localDate2 = LocalDate.from( zdt2 );
ใช้isEqual
วิธีพิเศษเพื่อทดสอบค่าวันที่เดียวกัน
Boolean sameDate = localDate1.isEqual( localDate2 );