2010-09-01 35 views
8

Chuỗi Tôi muốn định dạng trông như thế này: Chuỗi datetime = "9/1/10 11:34:35"Không thể phân tích DateTime-string với AM/PM marker

Tiếp theo khuôn mẫu cho công trình SimpleDateFormat :

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss"); 
Date d = sdf.parse(datetime); 
System.out.println(d); 

Output> [Wed Sep 01 11:34:35 CEST 2010] 

Tuy nhiên tôi cũng cần phân tích cú pháp AM/PM và khi tôi thêm mẫu đó vào mẫu, tôi nhận được ngoại lệ.

Pattern đó không làm việc:

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss a"); 

Tôi đã thử với điều này cũng với cùng một ngoại lệ:

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss aa"); 

Ngoại lệ:

java.text.ParseException: Unparseable date: "9/1/10 11:34:35 AM" 

tôi đã xem xét thông qua API tại http://download.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html#text nhưng dường như không thể tìm thấy nơi tôi làm sai.

Mọi đề xuất?

+0

cả hai "a" và "aa" đều phù hợp với tôi. phiên bản java của bạn là gì? – Bozho

Trả lời

25

Một khả năng là mặc định Locale của bạn có các ký hiệu khác nhau cho AM/PM. Khi xây dựng một định dạng ngày bạn nên luôn luôn cung cấp một Locale trừ khi bạn thực sự muốn sử dụng mặc định của hệ thống Locale, ví dụ .:

SimpleDateFormat sdf = new SimpleDateFormat("M/d/yy h:mm:ss a", Locale.US) 
+1

Cảm ơn bạn đã chỉ ra điều này. Làm cho tinh thần và giải quyết vấn đề của tôi. – aksamit

+1

Bài học ở đây là khi thực hiện công việc ngày giờ, ** luôn chỉ định miền địa phương và múi giờ mong muốn/mong muốn **. Nếu một trong hai bị bỏ qua, bạn hoàn toàn dựa vào mặc định hiện tại của JVM. Mẹo bổ sung: Google "Joda-Time" và "java.time". –

+0

Sẽ rất tuyệt nếu thông báo ngoại lệ không chỉ là "Ngày không thể đọc được" mà còn là vị trí trong Chuỗi nơi không thành công ... – golimar

0

Nếu bạn đang làm việc với Freemarker cho Java và bật về sử dụng vấn đề này dưới mã. Tôi đã có vấn đề này, miền địa phương của tôi đặt AM/PM là DE. Không chắc chắn lý do tại sao ... <#setting locale="en_US">

3

Tôi lấy ví dụ về ngày được đưa ra dưới đây và in ngày được định dạng thành định dạng 24 giờ nếu phù hợp với yêu cầu của bạn.

String inputdate="9/1/10 11:34:35 AM"; 
     SimpleDateFormat simpleDateFormat=new SimpleDateFormat("dd/MM/yy hh:mm:ss aa",Locale.getDefault()); 
     try { 
      System.out.println(""+new SimpleDateFormat("dd/MM/yy HH:mm:ss",Locale.getDefault()).format(simpleDateFormat.parse(inputdate))); 

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

Nếu bạn vẫn có bất kỳ truy vấn nào, vui lòng trả lời. Cảm ơn.

0

câu trả lời hiện đại:

String datetime = "9/1/10 11:34:35 AM"; 
    LocalDateTime dt = LocalDateTime.parse(datetime, 
      DateTimeFormatter.ofPattern("M/d/yy h:mm:ss a", Locale.ENGLISH)); 

này tạo ra một LocalDateTime của 2010-09-01T11: 34: 35. Hãy coi chừng hai năm chữ số, mặc dù; DateTimeFormatter sẽ giả định 2000 đến 2099. Đối với sinh nhật của tôi, điều này sẽ không chính xác.

Chúng tôi vẫn cần cung cấp ngôn ngữ. Vì điểm đánh dấu AM/PM hầu như không được sử dụng trong thực tế ở các ngôn ngữ khác ngoài tiếng Anh, tôi coi là Locale.ENGLISH một đặt cược khá an toàn. Hãy thay thế của riêng bạn.

Các câu trả lời khác là câu trả lời hay trong năm 2010 và 2011. Đã có năm 2014, các câu trả lời ở trên hợp lệ và tôi đã thích nó hơn.

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