tl; dr
LocalDateTime.parse(
"2016-01-23 12:34".replace( " " , "T" )
)
.atZone( ZoneId.of( "Asia/Karachi" ) )
.plusMinutes( 10 )
java.time
ใช้คลาส java.time ที่ยอดเยี่ยมสำหรับการทำงานวันที่และเวลา ชั้นเรียนเหล่านี้แย่งลำบากเก่าชั้นเรียนวันที่เวลาเช่นและjava.util.Date
java.util.Calendar
ISO 8601
คลาส java.time ใช้รูปแบบISO 8601 มาตรฐานโดยค่าเริ่มต้นสำหรับการแยกวิเคราะห์ / สร้างสตริงของค่าวันที่และเวลา ในการทำให้สตริงอินพุตของคุณสอดคล้องกันให้แทนที่ SPACE ตรงกลางด้วย a T
.
String input = "2016-01-23 12:34" ;
String inputModified = input.replace( " " , "T" );
LocalDateTime
แยกวิเคราะห์สตริงอินพุตของคุณLocalDateTime
เนื่องจากไม่มีข้อมูลเกี่ยวกับเขตเวลาหรือออฟเซ็ตจาก UTC
LocalDateTime ldt = LocalDateTime.parse( inputModified );
เพิ่มสิบนาที
LocalDateTime ldtLater = ldt.plusMinutes( 10 );
ldt.toString (): 2016-01-23T12: 34
ldtLater.toString (): 2016-01-23T12: 44
ดูรหัสที่อาศัยอยู่ใน IdeOne.com
ที่LocalDateTime
มีโซนเวลาไม่นานจึงไม่ได้เป็นตัวแทนของจุดบนไทม์ไลน์ที่ ใช้เขตเวลาเพื่อแปลเป็นช่วงเวลาจริง ระบุชื่อโซนเวลาที่เหมาะสมในรูปแบบของcontinent/region
เช่นAmerica/Montreal
, Africa/Casablanca
หรือหรือPacific/Auckland
Asia/Karachi
อย่าใช้อักษรย่อ 3-4 ตัวเช่นEST
หรือIST
หรือPKT
เนื่องจากไม่ใช่เขตเวลาจริงไม่เป็นมาตรฐานและไม่ซ้ำกัน (!)
ZonedDateTime
ถ้าคุณรู้ว่าโซนเวลาที่มีไว้สำหรับค่านี้ใช้จะได้รับZoneId
ZonedDateTime
ZoneId z = ZoneId.of( "Asia/Karachi" );
ZonedDateTime zdt = ldt.atZone( z );
zdt.toString (): 2016-01-23T12: 44 + 05: 00 [เอเชีย / การาจี]
ความผิดปกติ
ลองนึกดูว่าควรเพิ่ม 10 นาทีก่อนหรือหลังเพิ่มเขตเวลา คุณอาจจะได้รับผลที่แตกต่างกันมากเพราะความผิดปกติเช่นปรับเวลาตามฤดูกาล (DST) ที่เปลี่ยนเวลาผนังนาฬิกา
คุณควรเพิ่ม 10 นาทีก่อนหรือหลังการเพิ่มโซนนั้นขึ้นอยู่กับความหมายของสถานการณ์และกฎทางธุรกิจของคุณ
เคล็ดลับ: เมื่อคุณตั้งใจขณะที่เฉพาะเจาะจงในระยะเวลาที่มักจะเก็บข้อมูลเขตเวลา อย่าให้ข้อมูลนั้นสูญหายเช่นเดียวกับข้อมูลที่คุณป้อน ค่านี้12:34
หมายถึงเที่ยงในปากีสถานหรือเที่ยงในฝรั่งเศสหรือเที่ยงในควิเบก? หากคุณหมายถึงเวลาเที่ยงในปากีสถานให้พูดเช่นนั้นโดยใส่ offset-from-UTC ( +05:00
) เป็นอย่างน้อยและดีกว่าคือชื่อของเขตเวลา ( Asia/Karachi
)
Instant
หากคุณต้องการช่วงเวลาเดียวกับที่เห็นผ่านเลนส์ของUTCให้ดึงInstant
ไฟล์. Instant
ชั้นหมายถึงช่วงเวลาบนไทม์ไลน์ในส่วนUTCมีความละเอียดของนาโนวินาที (ถึงเก้า (9) ตัวเลขของส่วนทศนิยม)
Instant instant = zdt.toInstant();
แปลง
หลีกเลี่ยงคลาสวันเวลาเก่าที่ยุ่งยากทุกครั้งที่ทำได้ แต่ถ้าคุณต้องคุณสามารถแปลง เรียกเมธอดใหม่ที่เพิ่มในคลาสเก่า
java.util.Date utilDate = java.util.Date.from( instant );
เกี่ยวกับ java.time
java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date
, และCalendar
SimpleDateFormat
โครงการJoda-Timeขณะนี้อยู่ในโหมดการบำรุงรักษาแนะนำให้ย้ายไปที่ java.time
ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปกJSR 310
จะหาคลาส java.time ได้ที่ไหน?
- Java SE 8และ SE 9และใหม่กว่า
- ในตัว.
- ส่วนหนึ่งของ 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
และอื่น ๆ อีกมากมาย