tl; dr
LocalDate.parse(
"01-23-2017" ,
DateTimeFormatter.ofPattern( "MM-dd-uuuu" )
)
รายละเอียด
ฉันมี java.util.Date ในรูปแบบ yyyy-mm-dd
ดังที่ได้กล่าวไปแล้วDate
คลาสนี้ไม่มีรูปแบบ มีหน่วยนับเป็นมิลลิวินาทีนับตั้งแต่ต้นปี 1970 ใน UTC ไม่มีสตริงที่แนบมา
java.time
คำตอบอื่น ๆ ใช้คลาสวันที่และเวลาดั้งเดิมที่มีปัญหาซึ่งตอนนี้ถูกแทนที่ด้วยคลาส java.time
หากคุณมีให้java.util.Date
แปลงเป็นInstant
วัตถุ Instant
ชั้นหมายถึงช่วงเวลาบนไทม์ไลน์ในส่วนUTCมีความละเอียดของนาโนวินาที (ถึงเก้า (9) ตัวเลขของส่วนทศนิยม)
Instant instant = myUtilDate.toInstant();
เขตเวลา
คำตอบอื่น ๆ ไม่สนใจประเด็นสำคัญของเขตเวลา การกำหนดวันที่ต้องใช้เขตเวลา ในช่วงเวลาใดวันที่จะแตกต่างกันไปทั่วโลกตามโซน ไม่กี่นาทีหลังเที่ยงคืนในปารีสฝรั่งเศสเป็นวันใหม่ในขณะที่ "เมื่อวาน" ยังอยู่ในMontréalQuébec
Instant
กำหนดโซนเวลาที่คุณต้องการบริบทของคุณ
ZoneId z = ZoneId.of( "America/Montreal" );
สมัครZoneId
เพื่อรับไฟล์ZonedDateTime
.
ZonedDateTime zdt = instant.atZone( z );
LocalDate
หากคุณสนใจเฉพาะวันที่โดยไม่มีช่วงเวลาของวันให้แยกไฟล์LocalDate
.
LocalDate localDate = zdt.toLocalDate();
ในการสร้างสตริงในรูปแบบ ISO 8601 มาตรฐานปปปป - ดด - ววtoString
. คลาส java.time ใช้รูปแบบมาตรฐานตามค่าเริ่มต้นเมื่อสร้าง / แยกวิเคราะห์สตริง
String output = localDate.toString();
2017-01-23
หากคุณต้องการรูปแบบ MM-DD-YYYY ให้กำหนดรูปแบบการจัดรูปแบบ
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu" );
String output = localDate.format( f );
โปรดทราบว่าโค้ดรูปแบบการจัดรูปแบบจะคำนึงถึงขนาดตัวพิมพ์ รหัสในคำถามใช้ไม่ถูกต้องmm
(นาทีของชั่วโมง) แทนที่จะเป็นMM
(เดือนของปี)
ใช้DateTimeFormatter
วัตถุเดียวกันสำหรับการแยกวิเคราะห์ คลาส java.time เป็นเธรดที่ปลอดภัยดังนั้นคุณสามารถเก็บอ็อบเจ็กต์นี้ไว้รอบ ๆ และนำมาใช้ซ้ำได้แม้ข้ามเธรด
LocalDate localDate = LocalDate.parse( "01-23-2017" , f );
เกี่ยวกับ 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
และอื่น ๆ อีกมากมาย