2009-05-19 43 views
72

Tôi muốn chuyển đổi String thành Date ở các định dạng khác nhau.Chuỗi phân tích cú pháp cho đến ngày với định dạng khác nhau trong Java

Ví dụ,

Tôi nhận được từ người sử dụng,

String fromDate = "19/05/2009"; // i.e. (dd/MM/yyyy) format 

Tôi muốn chuyển đổi này fromDate như một đối tượng Ngày "yyyy-MM-dd" định dạng

Làm thế nào tôi có thể làm điều này?

+1

Đối tượng ngày không có định dạng, nó chỉ là số đại diện cho ngày tháng. Ngày có thể được biểu diễn bằng một Chuỗi có định dạng "yyyy-MM-dd". –

Trả lời

152

Hãy xem SimpleDateFormat. Mã này đi một cái gì đó như thế này:

SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy"); 
SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); 

try { 

    String reformattedStr = myFormat.format(fromUser.parse(inputString)); 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 
+1

thay vì nhận định dạng chuỗi, tôi có thể lấy đầu ra ở định dạng 'Ngày' không? – Rachel

+2

@Rachel: Chắc chắn, chỉ cần sử dụng 'phân tích cú pháp' và không tiếp tục với' định dạng'. 'parse' phân tích một chuỗi thành một ngày tháng. –

+2

Nhưng 'phân tích cú pháp 'cung cấp cho tôi trong' định dạng ngày' là 'Thứ Sáu ngày 06 tháng 1 00:01:00 EST 2012' nhưng nó cần định dạng ngày 2012-01-06' – Rachel

11

Sử dụng các lớp SimpleDateFormat:

private Date parseDate(String date, String format) throws ParseException 
{ 
    SimpleDateFormat formatter = new SimpleDateFormat(format); 
    return formatter.parse(date); 
} 

Cách sử dụng:

Date date = parseDate("19/05/2009", "dd/MM/yyyy"); 

Đối với hiệu quả, bạn sẽ muốn để lưu trữ và định dạng của bạn trong một hashmap. Hashmap là một thành viên tĩnh của lớp util của bạn.

private static Map<String, SimpleDateFormat> hashFormatters = new HashMap<String, SimpleDateFormat>(); 

public static Date parseDate(String date, String format) throws ParseException 
{ 
    SimpleDateFormat formatter = hashFormatters.get(format); 

    if (formatter == null) 
    { 
     formatter = new SimpleDateFormat(format); 
     hashFormatters.put(format, formatter); 
    } 

    return formatter.parse(date); 
} 
+8

CAVEAT !! Ý tưởng là tốt, nhưng việc thực hiện thì không. DateFormats không được lưu trữ tĩnh bởi vì chúng không an toàn thread! Nếu chúng được sử dụng từ nhiều hơn một sợi (và điều này luôn luôn nguy hiểm với các số liệu thống kê). FindBugs chứa một máy dò cho điều này (mà tôi đã xảy ra để đóng góp ban đầu, sau khi tôi bị cắn. Xem http://dschneller.blogspot.com/2007/04/calendar-dateformat-and-multi-threading.html :-)) –

+0

Mục nhập blog của bạn là một điều thú vị :-) Điều gì xảy ra nếu chính phương thức parseDate tôi đồng bộ hóa? Vấn đề là mặc dù nó có thể làm chậm mã xuống ... – Agora

+1

Miễn là phương thức parseDate là phương thức duy nhất truy cập vào bản đồ, việc đồng bộ hóa nó sẽ hoạt động. Tuy nhiên điều này sẽ - như bạn nói - giới thiệu một nút cổ chai. –

3

Trong khi SimpleDateFormat thực sự sẽ làm việc cho nhu cầu của bạn, ngoài ra bạn có thể muốn kiểm tra Joda Time, mà rõ ràng là cơ sở cho các thư viện làm lại ngày trong Java 7. Trong khi tôi thiên đường' Tôi đã sử dụng nó rất nhiều, tôi đã nghe không có gì ngoài những điều tốt đẹp về nó và nếu bạn thao tác ngày rộng rãi trong các dự án của bạn, nó có lẽ đáng để xem xét.

+0

Joda là tốt! Yay! –

7

Chuyển đổi một chuỗi ngày để java.sql.Date

String fromDate = "19/05/2009"; 
DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); 
java.util.Date dtt = df.parse(fromDate); 
java.sql.Date ds = new java.sql.Date(dtt.getTime()); 
System.out.println(ds);//Mon Jul 05 00:00:00 IST 2010 
1

Cách đơn giản để định dạng một ngày và chuyển đổi thành chuỗi

Date date= new Date(); 

    String dateStr=String.format("%td/%tm/%tY", date,date,date); 

    System.out.println("Date with format of dd/mm/dd: "+dateStr); 

đầu ra: ngày với định dạng của dd/dd/mm: 21/10/2015

5

tl; dr

LocalDate.parse( 
    "19/05/2009" , 
    DateTimeFormatter.ofPattern("dd/MM/uuuu") 
) 

Chi tiết

Các câu trả lời khác với java.util.Date, java.sql.Date, và SimpleDateFormat bây giờ lỗi thời.

LocalDate

Cách hiện đại để làm ngày-thời gian là làm việc với các lớp java.time, cụ thể LocalDate. Lớp LocalDate đại diện cho giá trị chỉ ngày mà không có thời gian trong ngày và không có múi giờ.

DateTimeFormatter

Để phân tích cú pháp, hoặc tạo ra, một chuỗi đại diện cho một giá trị ngày tháng thời gian, sử dụng lớp DateTimeFormatter.

DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/uuuu"); 
LocalDate ld = LocalDate.parse("19/05/2009" , f); 

Không làm cho đối tượng ngày giờ có chuỗi đại diện cho giá trị của nó. Đối tượng ngày giờ không định dạng, trong khi Chuỗi có. Đối tượng ngày giờ, chẳng hạn như LocalDate, có thể tạo một Chuỗi để biểu thị giá trị bên trong của nó, nhưng đối tượng ngày giờ và Chuỗi là các đối tượng riêng biệt riêng biệt.

Bạn có thể chỉ định bất kỳ định dạng tùy chỉnh nào để tạo Chuỗi. Hoặc để java.time thực hiện công việc tự động bản địa hóa.

DateTimeFormatter f = 
    DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL) 
        .withLocale(Locale.CANADA_FRENCH) ; 
String output = ld.format(f); 

Dump to console.

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

ld: 2009-05-19 | đầu ra: mardi 19 mai 2009

See in action 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 sang 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 8SE 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 6SE 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

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