2012-01-07 42 views
7

Tôi có một vấn đề trong chuyển đổi ngày trong java, không biết nơi tôi đang đi sai ...Java dạng ngày chuyển đổi - nhận sai tháng

String dateStr = "2011-12-15"; 
    String fromFormat = "yyyy-mm-dd"; 
    String toFormat = "dd MMMM yyyy"; 

    try { 
     DateFormat fromFormatter = new SimpleDateFormat(fromFormat); 
     Date date = (Date) fromFormatter.parse(dateStr); 

     DateFormat toformatter = new SimpleDateFormat(toFormat); 
     String result = toformatter.format(date); 

    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 

ngày Input là 2011-12-15 và Tôi hy vọng kết quả là "15 tháng 12 năm 2011", nhưng tôi nhận được kết quả là "15 tháng 1 năm 2011"

tôi sẽ gặp vấn đề gì?

Trả lời

21

fromFormat sử dụng số phút cần sử dụng hàng tháng.

String fromFormat = "yyyy-MM-dd"; 
+0

i am sooooo câm :(thanks .... – amithgc

+0

Không có probs. Đã ở đó :) – sje397

+0

s, Bạn,, của bạn,: p – fge

2

Nhìn vào javadoc của SimpleDateFormat và hãy xem những gì mà m đại diện. Không phải hàng tháng như bạn nghĩ nhưng phút.

1

m trong SimpleDateFormat là viết tắt của phút, trong khi M là viết tắt của tháng. Do đó, định dạng đầu tiên của bạn phải là yyyy-MM-dd.

+0

Một điều tôi thích SO là một câu hỏi được trả lời rất nhanh. 3 câu trả lời mới trong 1 phút khi tôi gõ câu trả lời, tuyệt vời! – ffriend

1
String fromFormat = "yyyy-MM-dd"; 
1

Từ định dạng nên:

String fromFormat = "yyyy-MM-dd" 
1

java.time

Trong khi trả lời chấp nhận là đúng (chữ hoa MM trong tháng), hiện nay là một phương pháp tốt hơn. Các lớp ngày giờ phiền hà cũ hiện nay đã được thay thế bởi các lớp java.time.

Chuỗi đầu vào của bạn ở định dạng chuẩn ISO 8601. Vì vậy, không cần phải chỉ định một mẫu định dạng để phân tích cú pháp.

LocalDate ld = LocalDate.parse("2011-12-15"); // Parses standard ISO 8601 format by default. 
Locale l = new Locale("en" , "IN") ; // English in India. 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG) 
             .withLocale(l); 
String output = ld.format(f); 

Dump to console.

System.out.println("ld.toString(): " + ld); 
System.out.println("output: " + output); 

ld.toString(): 2011-12-15

đầu ra: ngày 15 tháng 12 năm 2011

Xem live code in IdeOne.com.


Về java.time

Khung java.time được xây dựng vào Java 8 và sau đó.Các lớp này thay thế các lớp học ngày giờ legacy phiền hà cũ như java.util.Date, Calendar, & SimpleDateFormat.

Dự án Joda-Time, hiện đang ở maintenance mode, khuyên di chuyển đến các lớp java.time.

Để tìm hiểu thêm, hãy xem Oracle Tutorial. 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 lấy các lớp java.time?

Dự án mở rộng ThreeTen-Extra 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 những bổ sung có thể có trong tương lai vào java.time. Bạn có thể tìm thấy một số lớp học hữu ích tại đây như Interval, YearWeek, YearQuartermore.

Các vấn đề liên quan