TL; DR
วิธีการที่ทันสมัยใช้คลาสjava.time
YearMonth.from(
ZonedDateTime.parse(
"Mon Mar 14 16:02:37 GMT 2011" ,
DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" )
)
).toString()
2011-03
หลีกเลี่ยงคลาสวันและเวลาดั้งเดิม
วิธีที่ทันสมัยอยู่กับคลาส java.time คลาสวันที่และเวลาเก่าเช่นCalendar
ได้รับการพิสูจน์แล้วว่าออกแบบมาไม่ดีสับสนและมีปัญหา
กำหนดฟอร์แมตเตอร์แบบกำหนดเองเพื่อจับคู่สตริงอินพุตของคุณ
String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
ZonedDateTime
แยกวิเคราะห์เป็น
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
คุณมีความสนใจในปีและเดือน คลาส java.time มีYearMonth
คลาสสำหรับวัตถุประสงค์นั้น
YearMonth ym = YearMonth.from( zdt );
คุณสามารถสอบปากคำสำหรับหมายเลขปีและเดือนหากจำเป็น
int year = ym.getYear();
int month = ym.getMonthValue();
แต่toString
วิธีการสร้างสตริงในรูปแบบISO 8601 มาตรฐาน
String output = ym.toString();
ใส่ทั้งหมดนี้เข้าด้วยกัน
String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
YearMonth ym = YearMonth.from( zdt );
int year = ym.getYear();
int month = ym.getMonthValue();
ถ่ายโอนข้อมูลไปยังคอนโซล
System.out.println( "input: " + input );
System.out.println( "zdt: " + zdt );
System.out.println( "ym: " + ym );
อินพุต: จ. 14 มี.ค. 16:02:37 GMT 2011
zdt: 2011-03-14T16: 02: 37Z [GMT]
ym: 2011-03
รหัสสด
ดูรหัสนี้ทำงานใน IdeOne.com
การแปลง
หากคุณต้องมีCalendar
วัตถุคุณสามารถแปลงเป็นGregorianCalendar
วิธีการใหม่ที่ใช้ในคลาสเก่าได้
GregorianCalendar gc = GregorianCalendar.from( zdt );
เกี่ยวกับ 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
และอื่น ๆ อีกมากมาย