Chuyển đổi chuỗi ngày thành đối tượng DateTime bằng thư viện Joda Time


246

Tôi có một ngày là một chuỗi theo định dạng sau "04/02/2011 20:27:05". Tôi đang sử dụng thư viện Joda-Time và muốn chuyển đổi nó thànhDateTime đối tượng. Tôi đã làm:

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

Nhưng tôi nhận được lỗi sau:

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

Làm thế nào để chuyển đổi ngày trên thành một DateTimeđối tượng?


2
Đối với bất kỳ ai đến đây đang tìm cách phân tích chuỗi ngày bằng cách sử dụng java.timegói trong Java 8, hãy thử sử dụng LocalDateTime.parsehoặc Instant.parse.
heenenee

1
FYI, dự án Joda-Time hiện đang ở chế độ bảo trì , với nhóm tư vấn di chuyển đến các lớp java.time . Xem Hướng dẫn của Oracle .
Basil Bourque

Câu trả lời:


477

Sử dụng DateTimeFormat:

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

2
Xin chào, có thể là trình định dạng không chấp nhận múi giờ không? "zz" trả về "MEZ", khi áp dụng toStringhàm, nhưng tôi không thể phân tích cú pháp từ nó : Invalid format: "31. Januar 2013 06:38:08 MEZ" is malformed at "MEZ". Đây có phải là một vấn đề được biết đến? Làm thế nào tôi có thể tránh nó? Trân trọng.
Danyel

2
@Danyel: Bạn có thể thêm các múi giờ như DateTimeFormat.forPotype ("yyyy-MM-dd'T'HH: mm: ss.SSS'Z '") .withLocale (Locale.ROOT) .withChronology (ISOChronology) ;
Hyque

2
Tôi nhận được một định dạng không hợp lệ: "2014-11-04T17: 41: 52.000 + 01: 00" bị định dạng sai ở "+01: 00" với định dạng sau: cuối cùng tĩnh riêng DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPotype ("yyyy-MM- dd'T'HH: mm: ss.SSS'ZZ '"); DATE_TIME_FORMATTER.parseDateTime ((Chuỗi) customSoftware.get (tiêu đề [3])) trên joda-time 2.2
Stephane

2
Sau khi loại bỏ các trích dẫn duy nhất xung quanh ZZ, nó hoạt động. Tôi tự hỏi những trích dẫn đơn này có nghĩa là gì ...
Stephane

2
@StephaneEybert (hoặc bất kỳ ai khác) Các trích dẫn duy nhất có nghĩa là một cái gì đó là một ký tự theo nghĩa đen được mong đợi trong chuỗi, và không được coi là một phần của mẫu. Ví dụ: nếu ngày của bạn là "2015-08-dd30" vì một số lý do, bạn sẽ chỉ định "yyyy-MM-'dd'dd", chỉ ra rằng dd đầu tiên là một phần nghĩa đen được mong đợi trong chuỗi và dd thứ hai (bên ngoài dấu nháy đơn) là ngày thực tế cần được phân tích cú pháp. Vì vậy, trong trường hợp trước đó, nó sẽ hoạt động nếu thay vì múi giờ thực tế, bạn sẽ đặt "ZZ" vào cuối chuỗi thời gian đến của bạn.
SadBunny

62

Tôi biết đây là một câu hỏi cũ, nhưng tôi muốn thêm rằng, kể từ JodaTime 2.0, bạn có thể thực hiện điều này với một lớp lót:

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

3
Tôi nên đặt gì vào phần nhập khẩu?
Dmitry

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

7
Nên là: DateTimeFormat.forPotype ("dd / MM / yyyy HH: mm: ss"). ParseDateTime ("04/02/2011 20:27:05")
sufinawaz

16

Từ các bình luận, tôi đã chọn một câu trả lời thích và cũng thêm TimeZone:

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

Định dạng của bạn không phải là định dạng ISO mong đợi, bạn nên thử

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

5

Bạn cũng có thể sử dụng SimpleDateFormat , như trongDateTimeFormat

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 không trong trường hợp này, nhưng không tạo một phiên bản chia sẻ của SimpleDateFormat vì nó không an toàn cho chủ đề, đó là một cơn ác mộng để gỡ lỗi nếu bạn làm
dannrob

2
FYI, các lớp thời gian cũ rắc rối như java.util.Date, java.util.Calendarjava.text.SimpleDateFormathiện đang là di sản , được thay thế bởi các lớp java.time được tích hợp trong Java 8 & Java 9. Xem Hướng dẫn của Oracle . Và các lớp java.time là an toàn luồng, không giống như các lớp kế thừa.
Basil Bourque

3

Bạn cần một DateTimeFormatter phù hợp với định dạng bạn đang sử dụng. Hãy xem các tài liệu để được hướng dẫn về cách xây dựng một tài liệu.

Tôi nghĩ bạn cần 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

Cách tiếp cận hiện đại sử dụng các lớp java.time thay thế cho Joda-Time đáng kính dự án .

Phân tích cú pháp như LocalDateTimelà đầu vào của bạn thiếu bất kỳ chỉ báo nào về múi giờ hoặc offset-từ-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

Mẹo: Nếu có thể, hãy sử dụng các định dạng ISO 8601 tiêu chuẩn khi trao đổi giá trị thời gian theo ngày dưới dạng văn bản thay vì định dạng được thấy ở đây. Thuận tiện, các lớp java.time sử dụng các định dạng tiêu chuẩn khi phân tích cú pháp / tạo chuỗi.


Giới thiệu về java.time

Các java.time khung được xây dựng vào Java 8 và sau đó. Những lớp học thay thế cái cũ phiền hà di sản lớp học ngày thời gian như java.util.Date, Calendar, & SimpleDateFormat.

Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang các java.time lớp.

Để tìm hiểu thêm, xem Hướng dẫn Oracle . Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310 .

Nơi để có được các lớp java.time?

Các ThreeTen-Extra dự án mở rộng java.time với các lớp bổ sung. Dự án này là một nền tảng chứng minh cho các bổ sung có thể trong tương lai cho java.time. Bạn có thể tìm thấy một số các lớp học hữu ích ở đây chẳng hạn như Interval, YearWeek, YearQuarter, và nhiều hơn nữa .


2

Một phương pháp đơn giản:

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

    return dateRetour;
}

0

hai cách có thể đạt được .

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

Cả hai lỗi thời. Có một cách hiện đại quá; đó là câu trả lời của Basil Bourque . Ngoài ra, bạn không đóng góp bất cứ điều gì chưa có trong một số câu trả lời khác. Và khi Joda-Time được yêu cầu, việc đề xuất thậm chí còn lỗi thời và rắc rối nổi tiếng SimpleDateFormatxấu theo quan điểm trung thực nhất của tôi.
Ole VV
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.