2011-10-06 24 views
5

Tôi đang cố gắng phân tích cú pháp chuỗi ngày giờ với SimpleDateFormat.parse() nhưng tôi tiếp tục nhận được ngoại lệ ngày không thể chia sẻ.SimpleDateFormat "Ngày không thể chia sẻ" Ngoại lệ

Đây là định dạng ngày tôi đang cố gắng để phân tích: 2011-10-06T12:00:00-08:00

Đây là mã tôi đang sử dụng:

try { 
    String dateStr = "2011-10-06T12:00:00-08:00"; 
    SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 
    SimpleDateFormat dateFormatter = new SimpleDateFormat("MMM d, yyyy"); 
    Date date = dateParser.parse(dateStr); 
    System.out.println(dateFormatter.format(date));   
} catch(Exception e) { 
    System.out.println(e.getMessage()); 
} 

nào trả về lỗi này: java.text.ParseException: Unparseable date: "2011-10-06T12:00:00-08:00"

Theo như tôi biết đây là cách chính xác để sử dụng lớp SimpleDateFormat nhưng tôi không thông thạo Java vì vậy tôi có thể bị nhầm lẫn. Có ai biết vấn đề của tôi là gì không?

Trả lời

10

Múi giờ phải là GMT-08: 00 hoặc -0800 (như Madcore Tom đã nói). Xem Java docs.

Trong Java 7 bạn có thể sử dụng "yyyy-MM-dd'T'HH: mm: SSX"

+1

Tùy chọn 'X' là thứ tôi đang tìm kiếm. Tôi đã đọc tài liệu Java 6. Cảm ơn – Wade

+0

Đối với phần còn lại, không java7, bạn có thể thử sử dụng 'javax.xml.bind.DatatypeConverter.parseDateTime (ngày)' và có thêm thông tin có thể tìm thấy tại đây trên blog này http://ta.cnci.org/java -log/236-conversion-date –

0

Hãy thử với

SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz"); 
+0

Tôi nhận được kết quả tương tự – Wade

+0

Phân tích cú pháp đó ok cho tôi, môi trường nào bạn đang chạy tính năng này? – Rob

+0

Java 7 trên máy tính Windows 7 – Wade

10

Tôi tin rằng SimpleDateFormat sẽ không phân tích các múi giờ với một dấu hai chấm trong họ (-08: 00). Nó sẽ có thể phân tích cú pháp ngày 2011-10-06T12:00:00-0800.

Một số thao tác chuỗi đơn giản sẽ giúp bạn thoát khỏi dấu hai chấm.

+0

Có vẻ như đó là vấn đề . Cảm ơn bạn đã giúp đỡ. – Wade

-1

tôi muốn khuyên bạn sử dụng JodaTime cho các loại điều này.

Bạn đang cố gắng phân tích cú pháp định dạng Ngày ISO và Joda thực hiện điều đó 'ngoài hộp' và cũng sẽ mang lại cho bạn nhiều lợi ích khác.

Tôi từ lâu đã từ bỏ việc cố gắng để có được các lớp dữ liệu JDK chuẩn để làm những việc hữu ích.

+1

Tôi có thể đăng một số ví dụ về cách sử dụng thời gian JODA để giải quyết vấn đề phân tích cú pháp này không? – Saurabh

+0

Những lợi ích "nhiều" đó là gì? Trong số những thứ khác, nó cũng sẽ giới thiệu các trường hợp ngoại lệ đang cố phân tích các ngày khi tiết kiệm ánh sáng ban ngày xảy ra. –

+0

FYI, dự án [Joda-Time] (http://www.joda.org/joda-time/) hiện đang ở [chế độ bảo trì] (https://en.wikipedia.org/wiki/Maintenance_mode), với nhóm cố vấn di chuyển đến các lớp học [java.time] (http://docs.oracle.com/javase/9/docs/api/java/time/package-summary.html). Xem [Hướng dẫn của Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

0

Đối với một định dạng ngày tháng như 2013-06-28T00:00:00+00:00, mã này nên làm việc:

SimpleDateFormat sdfSource = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
0

Tôi chắc chắn hầu hết các bạn đã thất vọng từ thực tế là SimpleDateFormat không thể xử lý định dạng ISO8601. Đây là mẹo nhỏ của tôi để giải quyết phiền toái này.

Tạo danh sách Định dạng biết bạn biết rằng bạn sẽ sử dụng cho ứng dụng của mình và áp dụng SimpleDateFormat vào danh sách. Bây giờ, trong phương pháp formatDate() của bạn, đơn giản thử tất cả các định dạng và bẫy được biết đến của bạn ngoại lệ, sau đó nếu vẫn không có một ngày, chỉ cần sử dụng

Date d = javax.xml.bind.DatatypeConverter.parseDateTime("2013-06-28T00:00:00+00:00").getTime(); 
if (d == null) 
try { 
    SimpleDateFormater ... 
} 

để thử nó và xem nếu công việc đó. Để biết thêm thông tin Simple trick to convert Date format with timezone in Java!

1

Trước tiên, bạn cần định dạng giá trị trong "2011-10-06T12: 00: 00-08: 00".

Example: SimpleDateFormat dateParser = new SimpleDateFormat ("yyyy-MM-dd'T'HH: mm: ssZ"); 

Sau đó, tạo định dạng cho định dạng mong muốn. Ví dụ: SimpleDateFormat fmt = new SimpleDateFormat ("dd/MM/yyyy HH: mm: ss");

và sau khi phân tích cú pháp cho ngày. Ví dụ: Date date = dateParser.parse (dateFormat); và in ngày được tạo thành.

Dưới đây, một ví dụ hoàn chỉnh.

String dataStr = "2011-10-06T12: 00: 00-08: 00"; 
SimpleDateFormat dataParser = new SimpleDateFormat ("dd/MM/yyyy HH: mm: ss", Locale.US); 
Date date; 
Try { 
date = dataParser.parse (dataStr); 
System.out.println (dateFormatter.format (date)); 

} cath (ParseException e) { 

} 
1

tl; dr

OffsetDateTime.parse("2011-10-06T12:00:00-08:00") 
    .format( 
     DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.US) // Or Locale.CANADA_FRENCH and such. 
    ) 

Oct 6, 2011

java.time

Cách tiếp cận hiện đại sử dụng java.time lớp mà thay thế các lớp học ngày thời gian di sản cũ phiền hà.

Chuỗi đầu vào của bạn ở định dạng tuân thủ tiêu chuẩn ISO 8106. Các lớp java.time sử dụng các định dạng chuẩn này theo mặc định khi phân tích cú pháp/tạo chuỗi. 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 dưới dạng OffsetDateTime vì chuỗi đầu vào của bạn bao gồm bù trừ từ UTC chứ không phải múi giờ.

OffsetDateTime odt = OffsetDateTime.parse("2011-10-06T12:00:00-08:00") ; 

odt.toString(): 2011-10-06T12:00-08:00

Tạo một chuỗi trong định dạng mong muốn. Hãy để java.time tự động bản địa hóa chứ không phải là các mẫu định dạng mã cứng.

DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.US); // Or Locale.CANADA_FRENCH and such. 
String output = odt.format(f); 

output: Oct 6, 2011

Khi seralizing một giá trị ngày tháng thời gian dưới dạng văn bản, sử dụng tiêu chuẩn ISO 8601 định dạng chứ không phải là một định dạng cục bộ.

String output = odt.toLocalDate().toString() ; 

2011-10-06


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?

  • Java SE 8, Java SE 9, và sau đó
    • Built-in.
    • Một phần của API Java chuẩn với gói được triển khai.
    • Java 9 thêm một số tính năng và bản sửa lỗi nhỏ.
  • Java SE 6Java SE 7
    • Hầu hết các chức năng java.time được back-chuyển đến Java 6 & 7 trong ThreeTen-Backport.
  • Android
    • phiên bản sau của triển khai bó Android của các lớp java.time.
    • Đối với Android trước đó, dự án ThreeTenABP thích hợp ThreeTen-Backport (đã đề cập ở trên). Xem How to use ThreeTenABP….

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