ไม่สามารถรับ LocalDateTime จาก TemporalAccessor เมื่อแยกวิเคราะห์ LocalDateTime (Java 8)


150

ฉันแค่พยายามแปลงสตริงวันที่ให้เป็นวัตถุ DateTime ใน Java 8 เมื่อรันบรรทัดต่อไปนี้:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime dt = LocalDateTime.parse("20140218", formatter);

ฉันได้รับข้อผิดพลาดต่อไปนี้:

Exception in thread "main" java.time.format.DateTimeParseException: 
Text '20140218' could not be parsed: 
Unable to obtain LocalDateTime from TemporalAccessor: 
{},ISO resolved to 2014-02-18 of type java.time.format.Parsed
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
    at java.time.LocalDateTime.parse(LocalDateTime.java:492)

ไวยากรณ์เหมือนกับสิ่งที่ได้รับการแนะนำที่นี่แต่ฉันได้รับการยกเว้น JDK-8u25ฉันใช้

คำตอบ:


177

ปรากฎว่า Java ไม่ยอมรับค่า Date เปล่าเป็น DateTime ใช้ LocalDate แทน LocalDateTime แก้ปัญหา:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate dt = LocalDate.parse("20140218", formatter);

42
สำหรับสิ่งที่คุ้มค่า: ฉันมีปัญหาเดียวกันนี้แม้ว่าจะใช้งานLocalDateหรือไม่LocalDateTimeก็ตาม ปัญหาคือฉันสร้างการDateTimeFormatterใช้.withResolverStyle(ResolverStyle.STRICT);งานดังนั้นฉันจึงต้องใช้รูปแบบวันที่uuuuMMddแทนyyyyMMdd(เช่น "ปี" แทน "ปีแห่งยุค")!
ZeroOne

71

หากคุณต้องการแปลงวันที่ให้เป็นวัตถุ LocalDateTime คุณสามารถใช้ LocalDate.atStartOfDay () สิ่งนี้จะทำให้คุณเป็นวัตถุ LocalDateTime ณ วันที่ระบุโดยตั้งค่าฟิลด์ชั่วโมงนาทีและวินาทีเป็น 0:

final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime time = LocalDate.parse("20140218", formatter).atStartOfDay();

2
การแก้ไข: ตั้งค่าเป็นเวลาใดก็ได้ที่จะเริ่มในวันนั้น
Trejkaz

20
LocalDateTime.fromดูเหมือนว่าไม่จำเป็นเป็นผลตอบแทนแล้วatStartOfDay() LocalDateTime
Dariusz

1
สกาล่า: เวลา Val = LocalDate.parse ( "20171220" DateTimeFormatter.ofPattern ( "YYYYMMDD")) atStartOfDay.format (DateTimeFormatter.ofPattern ( "YYYY-MM-DD HH: mm: ss")).
วู้ดดี้อาทิตย์

48

สำหรับสิ่งที่มีค่าถ้าใครควรอ่านหัวข้อนี้ (เช่นฉัน) อีกครั้งคำตอบที่ถูกต้องจะอยู่ในDateTimeFormatterความหมายเช่น

private static DateTimeFormatter DATE_FORMAT =  
            new DateTimeFormatterBuilder().appendPattern("dd/MM/yyyy[ [HH][:mm][:ss][.SSS]]")
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
            .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
            .toFormatter(); 

หนึ่งควรตั้งค่าฟิลด์ตัวเลือกหากพวกเขาจะปรากฏขึ้น และรหัสที่เหลือควรเหมือนกันทุกประการ


1
นี่เป็นวิธีการแก้ปัญหาสากลที่แท้จริงสำหรับอินสแตนซ์สำหรับวิธีการดังกล่าว: Long getFileTimestamp (ไฟล์สตริงรูปแบบลวดลาย DateTimeFormatter dtf กลุ่ม int); ที่นี่คุณมีรูปแบบที่แตกต่างกันและ DateTimeFormetter, w / และเวลา w / o ที่ระบุ
toootooo

มันสามารถเป็นสนามเคลื่อนที่หรือไม่? ฉันไม่ได้พบใน Javadoc ที่อินสแตนซ์ที่สร้างขึ้นในลักษณะที่ปลอดภัยเธรด
Kamil Roman

อย่าลืมเพิ่มหลังจากที่คุณได้เรียกว่าparseDefaulting มิฉะนั้นก็จะให้appendPattern DateTimeParseException
wittyameta

31

นี่เป็นข้อความแสดงข้อผิดพลาดที่ไม่ชัดเจนและไม่มีประโยชน์จริงๆ หลังจากการทดลองและข้อผิดพลาดมากมายฉันพบว่าLocalDateTimeจะให้ข้อผิดพลาดด้านบนหากคุณไม่พยายามแยกเวลา โดยใช้LocalDateแทนมันทำงานโดยไม่มีข้อผิดพลาด

นี่เป็นเอกสารที่ไม่ดีและข้อยกเว้นที่เกี่ยวข้องนั้นไม่มีประโยชน์มาก


25

ขยายตัวในคำตอบของ retrography .. : ผมมีปัญหาเดียวกันนี้แม้เมื่อมีการใช้และไม่ได้LocalDate LocalDateTimeปัญหาคือฉันสร้างการDateTimeFormatterใช้.withResolverStyle(ResolverStyle.STRICT);งานดังนั้นฉันจึงต้องใช้รูปแบบวันที่uuuuMMddแทนyyyyMMdd(เช่น "ปี" แทน "ปีแห่งยุค")!

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
  .parseStrict()
  .appendPattern("uuuuMMdd")
  .toFormatter()
  .withResolverStyle(ResolverStyle.STRICT);
LocalDate dt = LocalDate.parse("20140218", formatter);

(เดิมวิธีนี้เป็นความเห็นต่อคำตอบ retrography ของ แต่ฉันได้รับการสนับสนุนให้โพสต์เป็นคำตอบแบบสแตนด์อโลนเพราะเห็นได้ชัดว่าทำงานได้ดีสำหรับคนจำนวนมาก.)


1
คำตอบสำหรับสาเหตุที่ "u" แทน "y" ได้รับการตอบในลิงก์นี้uuuu-versus-yyyy-in-datetimeformatter-formatting-pattern-pattern-pattern-in-java @Peru
prashanth

23

สำหรับทุกคนที่ลงจอดที่นี่ด้วยข้อผิดพลาดนี้เหมือนที่ฉันทำ:

Unable to obtain LocalDateTime from TemporalAccessor: {HourOfAmPm=0, MinuteOfHour=0}

มันมาจากบรรทัดต่อไปนี้:

LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy h:mm"));

มันกลับกลายเป็นว่าเป็นเพราะฉันใช้รูปแบบ 12 ชั่วโมงในชั่วโมง 0 แทนรูปแบบ 24 ชั่วโมง

การเปลี่ยนรูปแบบชั่วโมงเป็น 24 ชั่วโมงโดยใช้ capital H แก้ไข:

LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy H:mm"));

12

หาก String วันที่ไม่รวมค่าใด ๆ สำหรับชั่วโมงนาทีและอื่น ๆ คุณไม่สามารถแปลงเป็น a LocalDateTimeได้โดยตรง คุณสามารถแปลงเป็น a ได้LocalDateเท่านั้นเนื่องจากสตริงจะ แสดงส่วนประกอบของปีเดือนและวันที่เท่านั้นจึงเป็นสิ่งที่ถูกต้อง

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf); // 2018-03-06

LocalDateTimeอย่างไรก็ตามคุณสามารถแปลงนี้

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf);
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00

ตรวจสอบให้แน่ใจว่ารูปแบบถูกต้อง การแก้ไขนี้ไม่ทำงานสำหรับฉันเพราะฉันจนกำหนดรูปแบบไปเมื่อมันควรจะได้รับyyyy-mm-dd yyyy-MM-dd
patstuart

0

ลองอันนี้:

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM-dd-yyyy"); 
LocalDate fromLocalDate = LocalDate.parse(fromdstrong textate, dateTimeFormatter);

คุณสามารถเพิ่มรูปแบบใดก็ได้ที่คุณต้องการ นั่นเหมาะกับฉัน!


0

ใช้งานได้ดี

public class DateDemo {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm");
        String date = "16-08-2018 12:10";
        LocalDate localDate = LocalDate.parse(date, formatter);
        System.out.println("VALUE="+localDate);

        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
        LocalDateTime parse = LocalDateTime.parse(date, formatter1);
        System.out.println("VALUE1="+parse);
    }
}

เอาท์พุท:

VALUE=2018-08-16
VALUE1=2018-08-16T12:10
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.