การแปลงสตริงวันที่เป็นวัตถุ DateTime โดยใช้ห้องสมุด Joda Time


246

"04/02/2011 20:27:05"ฉันมีวันที่เป็นสตริงในรูปแบบต่อไปได้ ฉันใช้ห้องสมุด Joda-Time และต้องการแปลงเป็นDateTimeวัตถุ ฉันทำ:

DateTime dt = new DateTime("04/02/2011 20:27:05")

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

Invalid format: "04/02/2011 14:42:17" is malformed at "/02/2011 14:42:17"

วิธีการแปลงวันที่ด้านบนเป็นDateTimeวัตถุ?


2
สำหรับทุกคนที่เดินทางมาถึงที่นี่มองหาวิธีที่จะแยกสายวันที่ใช้java.timeแพคเกจในชวา 8 ลองใช้หรือLocalDateTime.parse Instant.parse
heenenee

1
FYI โครงการJoda-Timeขณะนี้อยู่ในโหมดบำรุงรักษาโดยทีมงานให้คำแนะนำการย้ายถิ่นไปยังคลาสjava.time ดูการสอนโดยออราเคิล
Basil Bourque

คำตอบ:


477

การใช้DateTimeFormat:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime dt = formatter.parseDateTime(string);

2
สวัสดีเป็นไปได้ไหมที่ฟอร์แมตเตอร์ไม่ยอมรับเขตเวลา "ZZ" ผลตอบแทน "MEZ" เมื่อใช้toStringฟังก์ชั่น Invalid format: "31. Januar 2013 06:38:08 MEZ" is malformed at "MEZ"แต่ฉันไม่สามารถแยกจากมัน: นี่เป็นปัญหาที่ทราบหรือไม่? ฉันจะหลีกเลี่ยงได้อย่างไร ความนับถือ.
Danyel

2
@Danyel: คุณสามารถเพิ่มเขตเวลาเช่น DateTimeFormat.forPattern ("yyyy-MM-dd'T'HH: mm: ss.SSS'Z '") .withLocale (Locale.ROOT) .withChocology (ISOChronology.getInstanceUTC ()) ;
Hyque

2
ฉันได้รับรูปแบบที่ไม่ถูกต้อง: "2014-11-04T17: 41: 52.000 + 01: 00" มีรูปแบบไม่ถูกต้องที่ "+01: 00" โดยมีตัวจัดรูปแบบต่อไปนี้: ส่วนตัวแบบคงที่สุดท้าย DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern ("yyyy-MM-) dd'T'HH: mm: ss.SSS'ZZ ' "); DATE_TIME_FORMATTER.parseDateTime (สตริง) customSoftware.get (ส่วนหัว [3])) ใน joda-time 2.2
Stephane

2
หลังจากลบเครื่องหมายคำพูดเดี่ยวรอบ ZZ แล้วก็ทำงานได้ ฉันสงสัยว่าราคาเดียวเหล่านี้หมายถึง ...
สเตฟาน

2
@StephaneEybert (หรือคนอื่น ๆ ) เครื่องหมายคำพูดเดี่ยวหมายความว่าสิ่งที่เป็นตัวอักษรที่คาดหวังในสตริงและจะไม่ถือว่าเป็นส่วนหนึ่งของรูปแบบ ตัวอย่างเช่น: หากวันที่ของคุณเข้ามาเป็น "2015-08-dd30" ด้วยเหตุผลบางอย่างคุณจะระบุ "yyyy-MM-'dd'dd" เพื่อระบุว่า dd แรกนั้นเป็นตัวอักษรที่คาดหวังในสตริงและ second dd (นอก apostrophes) คือวันที่แท้จริงที่ต้องทำการแยกวิเคราะห์ ดังนั้นในกรณีก่อนหน้าของคุณมันจะได้ผลถ้าแทนเขตเวลาที่แท้จริงคุณจะต้องใส่ "ZZ" ในตอนท้ายของสตริงข้อมูลที่เข้ามาของคุณ
SadBunny

62

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันต้องการที่จะเพิ่มที่ JodaTime 2.0 คุณสามารถทำได้ด้วยสายการบินเดียว:

DateTime date = DateTime.parse("04/02/2011 20:27:05", 
                  DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"));

3
ฉันควรใส่อะไรในส่วนการนำเข้า
Dmitry

20
DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");

7
ควรเป็น: DateTimeFormat.forPattern ("dd / MM / yyyy HH: mm: ss"). parseDateTime ("04/02/2011 20:27:05")
sufinawaz

16

จากความคิดเห็นที่ฉันเลือกคำตอบที่ชอบและยังเพิ่มเขตเวลา:

String dateTime = "2015-07-18T13:32:56.971-0400";

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
        .withLocale(Locale.ROOT)
        .withChronology(ISOChronology.getInstanceUTC());

DateTime dt = formatter.parseDateTime(dateTime);

13

รูปแบบของคุณไม่ใช่รูปแบบ ISO ที่คาดหวังคุณควรลอง

DateTimeFormatter format = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime time = format.parseDateTime("04/02/2011 20:27:05");

5

คุณยังสามารถใช้SimpleDateFormatได้เช่นกันDateTimeFormat

Date startDate = null;
Date endDate = null;
try {
    if (validDateStart!= null) startDate = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH).parse(validDateStart + " " + validDateStartTime);
    if (validDateEnd!= null) endDate = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH).parse(validDateEnd + " " + validDateEndTime);
} catch (ParseException e) {
    e.printStackTrace();
}

3
kirlisakal ไม่ได้ในกรณีนี้ แต่ไม่ได้สร้างอินสแตนซ์ร่วมกันของ SimpleDateFormat ขณะที่มันไม่ด้ายปลอดภัยก็เป็นฝันร้ายที่จะแก้ปัญหาถ้าคุณทำ
dannrob

2
FYI, ลำบากเก่าชั้นเรียนวันที่เวลาเช่นjava.util.Date, java.util.Calendarและjava.text.SimpleDateFormatตอนนี้มรดกแทนที่โดยjava.timeชั้นเรียนที่สร้างขึ้นใน Java 8 และ Java 9 โปรดดูที่การสอนโดยออราเคิล และคลาส java.time นั้นเป็น thread-safe ซึ่งแตกต่างจากคลาสดั้งเดิม
Basil Bourque

3

คุณต้องการDateTimeFormatterที่เหมาะสมกับรูปแบบที่คุณใช้ ดูเอกสารสำหรับคำแนะนำเกี่ยวกับวิธีการสร้างเอกสาร

ปิดข้อมือฉันคิดว่าคุณต้องการ format = DateTimeFormat.forPattern("M/d/y H:m:s")


3

TL; DR

java.time.LocalDateTime.parse( 
    "04/02/2011 20:27:05" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" )
)

java.time

วิธีการที่ทันสมัยใช้คลาส java.time ที่แทนที่Joda-Time ที่น่าเคารพโปรเจ็กต์เชื่อถือ

แยกวิเคราะห์ตามLocalDateTimeอินพุตของคุณไม่มีตัวบ่งชี้ใด ๆ ของเขตเวลาหรือออฟเซ็ตจาก UTC

String input = "04/02/2011 20:27:05" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

ldt.toString (): 2011-02-04T20: 27: 05

เคล็ดลับ: หากเป็นไปได้ให้ใช้รูปแบบISO 8601 มาตรฐานเมื่อแลกเปลี่ยนค่าวันที่และเวลาเป็นข้อความแทนที่จะเป็นรูปแบบที่เห็นที่นี่ สะดวกคลาส java.time ใช้รูปแบบมาตรฐานเมื่อแยก / สร้างสตริง


เกี่ยวกับ java.time

java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date, และCalendarSimpleDateFormat

Joda เวลาโครงการขณะนี้อยู่ในโหมดการบำรุงรักษาให้คำแนะนำแก่การโยกย้ายไปยังjava.timeชั้นเรียน

ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปกJSR 310

จะรับคลาส java.time ได้ที่ไหน?

  • Java SE 8 , Java SE 9และใหม่กว่า
    • Built-in
    • เป็นส่วนหนึ่งของ Java API มาตรฐานที่มีการใช้งานแบบรวม
    • Java 9 เพิ่มคุณสมบัติและการแก้ไขเล็กน้อย
  • Java SE 6และ Java SE 7
    • มากของการทำงาน java.time จะกลับรังเพลิง Java 6 และ 7 ในThreeTen-ย้ายกลับ
  • Android

โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โครงการนี้เป็นพื้นฐานที่พิสูจน์ได้สำหรับการเพิ่มเติมในอนาคตไปยัง java.time คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval, YearWeek, YearQuarterและอื่น ๆ อีกมากมาย


2

วิธีการง่าย ๆ :

public static DateTime transfStringToDateTime(String dateParam, Session session) throws NotesException {
    DateTime dateRetour;
    dateRetour = session.createDateTime(dateParam);                 

    return dateRetour;
}

0

มีสองวิธีนี้อาจจะประสบความสำเร็จ

DateTimeFormat

DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");

SimpleDateFormat

        String dateValue = "04/02/2011 20:27:05";
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); //  04/02/2011 20:27:05

        Date date = sdf.parse(dateValue); // returns date object
        System.out.println(date); // outputs: Fri Feb 04 20:27:05 IST 2011

ทั้งความร้อนล้าสมัย มีวิธีที่ทันสมัยเช่นกัน; มันอยู่ในคำตอบโดยเพรา Bourque นอกจากนี้คุณไม่ได้มีส่วนร่วมอะไรที่ไม่ได้อยู่ในคำตอบอื่น ๆ และเมื่อมีการขอให้ Joda-Time การแนะนำว่าปัญหาที่ล้าสมัยและไม่SimpleDateFormatเป็นที่รู้จักยิ่งกว่านั้นเป็นเรื่องที่ไม่ดีในความคิดเห็นที่ซื่อสัตย์ที่สุดของฉัน
Ole VV
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.