2016-09-30 17 views
10

Có gì sai trong mã này? Tôi đang cố gắng để phân tích một định dạng ngày có 0 giữa năm và tháng.Ngày không thể chia sẻ với số phụ trong Java

import java.text.SimpleDateFormat; 

class Main { 
    public static void main(String[] args) { 
     SimpleDateFormat format = new SimpleDateFormat("yyyy'0'MMdd"); 
     try { 
      Date date = format.parse("201600101"); 
      System.out.println(date); 
     } catch (Exception ex) { 
      System.out.println(ex.getMessage()); 
     } 
    } 
} 

Kết quả đầu ra Không thể ghi ngày tháng: "201600101". Nếu tôi thay đổi '0' thành bất kỳ thứ gì trừ số [ví dụ: 'X' và format.parse ("2016X0101")] thao tác này sẽ hoạt động.

+5

Đoán của tôi là nó thấy '20160' là một năm. 'yyyy' có thể là 2,3,4,5 chữ số năm. –

+0

Nếu bạn biết định dạng theo nguyên tắc, tại sao không chỉ loại bỏ thêm số không? –

+0

đó là một điều thú vị .. có vẻ như nó hoạt động, khi bạn thêm khoảng trắng, vì vậy, ví dụ: mẫu "yyyy '0'MMdd" được hiểu như mong đợi. –

Trả lời

3

Như Peter Lawrey cho biết Java thấy '20160' là một năm. Bạn có thể giải quyết vấn đề của bạn bằng cách sửa đổi "201600101", ví dụ, 2016-00101 và refactor patter định dạng của bạn như

SimpleDateFormat format = new SimpleDateFormat("yyyy-'0'MMdd"); 

Điều đó sẽ phân tích ngày của bạn.

1

Sử dụng thư viện nơi bạn có thể sử dụng độ rộng cố định gồm bốn chữ số cho năm sẽ thực hiện thủ thuật. Ví dụ cho java.time -package trong Java-8:

String input = "201600101"; 

    DateTimeFormatter dtf = 
     new DateTimeFormatterBuilder() 
      .appendValue(ChronoField.YEAR, 4, 4, SignStyle.NEVER) 
      .appendLiteral('0') 
      .appendPattern("MMdd") 
      .toFormatter(); 
    LocalDate date = LocalDate.parse(input, dtf); 
    System.out.println(date); // 2016-01-01 

Điều này có lợi thế mạnh mẽ không bị buộc phải thay đổi đầu vào. Nó luôn luôn là tốt hơn để thay đổi định dạng. Thừa nhận, không thể với SimpleDateFormat.

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