สตริงเป็น LocalDate


105

ฉันจะแปลงสตริงเป็น a ได้LocalDateอย่างไร?

ฉันเคยเห็นตัวอย่างเช่น:

LocalDate dt = new LocalDate("2005-11-12");

แต่สตริงของฉันเป็นเหมือน:

2005-nov-12

คำตอบ:


79

ในขณะที่คุณใช้ Joda Time คุณควรใช้DateTimeFormatter:

final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MMM-dd");
final LocalDate dt = dtf.parseLocalDate(yourinput);

หากใช้ Java 8 หรือใหม่กว่าให้อ้างอิงคำตอบของ hertzi


ส่งการแก้ไขสำหรับรูปแบบ "yyyy-MMM-dd" ด้วย YYYY เป็นปีแห่งยุคและ (อย่างยิ่งยวด) DD คือวันของปี
Spencer Kormos

คำตอบผิดเล็กน้อย ... สำหรับเวลา joda คลาสที่ใช้คือ DateTimeFormat ไม่ใช่ DateTimeFormatter กล่าวอีกนัยหนึ่งเรียก DateTimeFormat.ofPattern ("yyyy-MM-dd") parseLocalDate (yourInput);
Dan Haywood

193

java.time

ตั้งแต่ Java 1.8 คุณสามารถทำได้โดยไม่ต้องมีไลบรารีเพิ่มเติมโดยใช้คลาสjava.time ดูการสอน

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MMM-dd");
formatter = formatter.withLocale( putAppropriateLocaleHere );  // Locale specifies human language for translating, and cultural norms for lowercase/uppercase and abbreviations and such. Example: Locale.US or Locale.CANADA_FRENCH
LocalDate date = LocalDate.parse("2005-nov-12", formatter);

ไวยากรณ์เกือบจะเหมือนกัน


java.time.format.DateTimeParseException: ไม่สามารถแยกวิเคราะห์ข้อความ '2005-nov-12' ที่ดัชนี 5
Atte Juvonen

3
สิ่งนี้เกิดขึ้นเนื่องจากภาษาเริ่มต้นของคุณคาดว่า 'N' ของ 'พฤศจิกายน' เป็นตัวพิมพ์ใหญ่
hertzi

ดูคำตอบของฉันสำหรับคำถามที่คล้ายกันสำหรับการอภิปรายเพิ่มเติมเกี่ยวกับแนวทางนี้
Basil Bourque

14

คุณอาจต้องเปลี่ยนจาก DateTime เป็น LocalDate

ใช้ Joda Time:

DateTimeFormatter FORMATTER = DateTimeFormat.forPattern("yyyy-MMM-dd");
DateTime dateTime = FORMATTER.parseDateTime("2005-nov-12");
LocalDate localDate = dateTime.toLocalDate();

2
โปรดทราบว่าคำตอบนี้หมายถึง Joda ไม่ใช่ Java SE
DavidS

9

การจัดรูปแบบวันที่และเวลาดำเนินการโดยorg.joda.time.format.DateTimeFormatter class. สามคลาสมีวิธีการจากโรงงานในการสร้างฟอร์แมตและนี่คือหนึ่ง อื่น ๆ คือISODateTimeFormatและDateTimeFormatterBuilder.

DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MMM-dd");
LocalDate lDate = new LocalDate().parse("2005-nov-12",format);

final org.joda.time.LocalDate classเป็นระดับ datetime ไม่เปลี่ยนรูปเป็นตัวแทนของวันที่ไม่มีเขตเวลาที่ LocalDateมีความปลอดภัยต่อเธรดและไม่เปลี่ยนรูปโดยมีเงื่อนไขว่าลำดับเหตุการณ์เป็นเช่นกัน คลาส Chronology มาตรฐานทั้งหมดที่ให้มานั้นปลอดภัยต่อเกลียวและไม่เปลี่ยนรูป


1

DateTimeFormatter มีรูปแบบในตัวที่สามารถใช้เพื่อแยกวิเคราะห์ลำดับอักขระได้โดยตรง เป็นกรณีที่มีความละเอียดอ่อนพฤศจิกายนจะใช้งานได้อย่างไรก็ตามพฤศจิกายนและพฤศจิกายนจะไม่ทำงาน:

DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MMM-dd");

try {
    LocalDate datetime = LocalDate.parse(oldDate, pattern);
    System.out.println(datetime); 
} catch (DateTimeParseException e) {
    // DateTimeParseException - Text '2019-nov-12' could not be parsed at index 5
    // Exception handling message/mechanism/logging as per company standard
}

DateTimeFormatterBuilderให้วิธีสร้างฟอร์แมตเตอร์แบบกำหนดเอง ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่, พ.ย. , พ.ย. และ พ.ย. จะถือว่าเหมือนกัน

DateTimeFormatter f = new DateTimeFormatterBuilder().parseCaseInsensitive()
        .append(DateTimeFormatter.ofPattern("yyyy-MMM-dd")).toFormatter();
try {
    LocalDate datetime = LocalDate.parse(oldDate, f);
    System.out.println(datetime); // 2019-11-12
} catch (DateTimeParseException e) {
     // Exception handling message/mechanism/logging as per company standard
}

1
ยินดีต้อนรับสู่ SO เราขอขอบคุณข้อมูลของคุณ! โปรดแก้ไขคำตอบของคุณและให้คำอธิบายเพิ่มเติมว่าเกี่ยวข้องกับคำถามอย่างไรคุณได้คำตอบมาจากที่ใดเหตุใดจึงได้ผล สำหรับคำแนะนำเพิ่มเติมโปรดดูstackoverflow.com/help/how-to-answer
B - rian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.