2010-06-24 32 views
12

Tôi muốn xác thực và phân tích ngày bằng cách sử dụng simpleDateFormat với định dạng "yyyymmdd" Điều này cũng cho phép 100624, được phân tích cú pháp đến năm thứ 10 (54 năm sau khi Julius Ceasar qua đời). Những ngày tháng cũng sẽ giống như năm 1970, vì vậy tôi không muốn giải quyết với SimpleDateFornat ("yymmdd").buộc 4 chữ số năm trong java's simpleedateformat

Tôi tự hỏi có cách nào để ép buộc định dạng bốn chữ số bằng cách sử dụng SimpleDateFormat không? Tôi gần để làm một kiểm tra regexp trả trước nhưng có lẽ có một cách thông minh để sử dụng (Simple) DateFormat()?

Khi được yêu cầu mã, mọi thứ trở nên phức tạp hơn và nghiên cứu của tôi là một nửa. Định dạng được sử dụng là yyyy-MM-dd để bắt đầu (nó đến từ một biến, có javadoc sai). Tuy nhiên như được chỉ ra trong một câu trả lời dưới đây yyyyMMdd không ép buộc một chữ số bốn năm. Vì vậy, câu hỏi của tôi được thay đổi để Làm thế nào để buộc một năm bốn chữ số cho định dạng "yyyy-MM-dd". Và tại sao "yyyyMMdd" lại hành xử khác?

public void testMaturity() { 
    try { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
     sdf.setLenient(false); 
     System.out.println(" " + sdf.format(sdf.parse("40-12-14"))); 
     SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd"); 
     sdf.setLenient(false); 
     System.out.println(" " + sdf2.format(sdf2.parse("401214"))); 
     fail(); 
    } catch (ParseException pe) { 
     assertTrue(true); 
    } 

nào in 0040-12-14

+0

Nếu ngày đòi hỏi yyyymmdd sau đó năm 10 sẽ là 0010.Tôi không thấy bất kỳ vấn đề với điều này, bạn không cho phép họ nhập 1 cho ngày đầu tiên (01) hoặc cho tháng đầu tiên, vậy tại sao cho phép nó trong nhiều năm. – Goibniu

Trả lời

3

Đơn giản chỉ cần sử dụng yyyyMMdd (lưu ý: chữ hoa M được sử dụng để chỉ tháng, nếu không you're parsing minutes) và sau đó kiểm tra nếu năm là hơn một số ngày cắt (ví Ví dụ, khi phân tích ngày tháng năm sinh, lớn hơn 1800 là một cược an toàn, khi phân tích ngày tháng cho các ngày lên cao hơn hoặc bằng năm hiện tại sẽ là tốt).

2

Hmm. Tôi nghi ngờ bạn nên sử dụng "MM" thay vì "mm" để bắt đầu với ... nhưng "100.624" không phân tích nào khi tôi thử nó - ngay cả trong chế độ khoan dung:

import java.util.*; 
import java.text.*; 

public class Test 
{ 
    public static void main(String[] args) throws Exception 
    { 
     SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); 
     format.setLenient(true); 
     tryParse(format, "100624"); 
     format.setLenient(false); 
     tryParse(format, "100624"); 
    } 

    static void tryParse(DateFormat format, String text) 
    { 
     try 
     { 
      Date date = format.parse(text); 
      System.out.println("Parsed " + text + " to " + date); 
     } 
     catch (ParseException pe) 
     { 
      System.out.println("Failed to parse " + text); 
     } 
    } 
} 

(Và thậm chí sử dụng "mm" thay vì "mM" nó vẫn thất bại trong việc phân tích)

Prints:.

Failed to parse 100624 
Failed to parse 100624 

lẽ bạn có thể hiển thị các mã mà quản lý để phân tích này?

+0

Cảm ơn! Tôi đã thêm một số mã để thử nghiệm và phát hiện ra rằng định dạngString không giống như những gì được mong đợi và yyyyMMdd thực sự buộc phải có yêu cầu 4 chữ số năm. Vẫn còn điển hình rằng yyyy-MM-dd cư xử khác nhau. –

2

Hãy thử gọi setLenient(false); trên đối tượng SimpleDateFormat - điều đó sẽ làm cho nó sử dụng các quy tắc phân tích nghiêm ngặt hơn (nếu không sẽ cố "thông minh" nếu chuỗi đầu vào không khớp chính xác với định dạng). Ví dụ:

DateFormat df = new SimpleDateFormat("yyyyMMdd"); 
df.setLenient(false); 

Và dĩ nhiên, vì tháng là MM, không mm.

1

Không có cách nào dễ dàng cho việc này. Nếu bạn đang nói rằng ngày tháng có thể giống như năm 1970, câu hỏi chính sẽ là những gì 700624 có nghĩa là - 1970 hoặc 2070? Bạn nên thực hiện một số ngày cutoff như Joachim đề xuất hoặc di chuyển hoàn toàn đến 4 chữ số năm.

1

Vâng, nó khá thẳng và tiến. Thực hiện theo các bước đơn giản:

Bước 1:

try { 
    String dates = "40-12-14"; 
    String patterns = "yy-MM-dd"; 
    SimpleDateFormat format3 = new SimpleDateFormat(patterns);`` 
    java.util.Date dates1 = format3.parse(dates); 

    SimpleDateFormat sdfDates = new SimpleDateFormat("dd/MM/yyyy"); 

    String strDate1 = sdfDate.format(dates1); 
    System.out.println("Date1: " + strDate1); 

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

Sản lượng này sẽ:

Date1: 14/12/1940 
Các vấn đề liên quan