Câu hỏi Chuỗi phân tích cú pháp thành ngày với định dạng khác nhau trong Java


Tôi muốn chuyển đổi String đến Date ở các định dạng khác nhau.

Ví dụ,

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

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

Tôi muốn chuyển đổi fromDate như một đối tượng Date của "yyyy-MM-dd" định dạng

Tôi có thể làm cái này như thế nào?


76
2018-05-19 12:22


gốc


Một đối tượng Date không có định dạng, nó chỉ là một 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". - Carlos Heuberger


Các câu trả lời:


Hãy xem SimpleDateFormat. Các mã đ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();
}

159
2018-05-19 12:31



thay vì nhận định dạng chuỗi, tôi có thể nhận được kết quả đầu ra không Date định dạng? - Rachel
@Rachel: Chắc chắn, chỉ cần sử dụng parse và đừng tiếp tục format. parse phân tích chuỗi thành một ngày. - Michael Myers♦
Nhưng parse cho tôi vào date format như Fri Jan 06 00:01:00 EST 2012 nhưng nó cần 2012-01-06 Định dạng ngày tháng - Rachel
@Rachel đó là bởi vì khi bạn gọi System.out.println(anyDateObject) phương thức toString () mặc định được gọi là phương thức được cho là in ở định dạng đó, ví dụ: Fri Jan 06 00:01:00 EST 2012. Bạn cần phải ghi đè lên nó cho phù hợp với nhu cầu của bạn. - KNU
FYI, các lớp ngày giờ phiền hà cũ như java.util.Date, java.util.Calendarvà java.text.SimpleDateFormat bây giờ là di sản, được thay thế bởi java.time các lớp được xây dựng trong Java 8 & Java 9. Xem Hướng dẫn bởi Oracle. - Basil Bourque


Sử dụng SimpleDateFormat lớp học:

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

Sử dụng:

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

Để có hiệu quả, bạn sẽ muốn lưu trữ các trình đị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);
}

12
2018-05-19 12:31



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. dschneller.blogspot.com/2007/04/… :-)) - Daniel Schneller
Mục nhập blog của bạn là một điều thú vị :-) Điều gì sẽ xảy ra nếu chính phương thức parseDate tôi đồng bộ hóa? Vấn đề là nó có thể làm chậm mã xuống ... - Agora
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. - Daniel Schneller


Kiểm tra javadocs cho java.text.SimpleDateFormat Nó mô tả mọi thứ bạn cần.


7
2018-05-19 12:28





Chuyển đổi ngày chuỗi thành 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

7
2017-08-21 07:01





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.DateSimpleDateFormat hiện đã lỗi thời.

LocalDate

Cách hiện đại để làm ngày giờ là làm việc với các lớp java.time, cụ thể LocalDate. Các LocalDate lớp đại diện cho một 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, một Chuỗi biểu thị giá trị ngày-thời gian, hãy sử dụng DateTimeFormatter lớp học.

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

Không conflate một đối tượng ngày-thời gian với một String đạ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 ra một String để biểu diễn giá trị bên trong của nó, nhưng đối tượng ngày tháng 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 để điều khiển.

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

ld: 2009-05-19 | sản lượng: mardi 19 mai 2009

Xem trong hành động trong IdeOne.com.


Trong khoảng java.time

Các java.time khung công tác được xây dựng trong Java 8 trở lên. Những lớp này thay thế cho cái cũ phiền hà di sản các lớp ngày giờ như java.util.Date, Calendar, & SimpleDateFormat.

Các Joda-Time dự án, bây giờ trong chế độ bảo trì, khuyên di chuyển đến java.time các lớp học.

Để tìm hiểu thêm, hãy xem Hướng dẫn Oracle. 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.

Bạn có thể trao đổi java.time đối tượng trực tiếp với cơ sở dữ liệu của bạn. Sử dụng một Trình điều khiển JDBC tuân thủ JDBC 4.2 hoặc sau đó. Không cần dây, không cần java.sql.* các lớp học.

Nơi để có được các lớp học java.time?

  • Java SE 8, Java SE 9, và sau đó
    • Được xây dựng trong.
    • Một phần của API Java chuẩn với việc triển khai kèm theo.
    • Java 9 bổ sung thêm một số tính năng và sửa lỗi nhỏ.
  • Java SE 6 và Java SE 7
    • Phần lớn chức năng java.time được chuyển sang Java 6 & 7 trong ThreeTen-Backport.
  • Android
    • Các phiên bản sau của triển khai gói Android của các lớp java.time.
    • Đối với Android trước đó (<26), ThreeTenABP điều chỉnh dự án ThreeTen-Backport (đã đề cập ở trên). Xem Cách sử dụng ThreeTenABP….

Các ThreeTen-Extra dự án mở rộng 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 ở đây như Interval, YearWeek, YearQuarterhơn.


7
2017-10-26 00:18





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 Giờ Joda, đó rõ ràng là cơ sở cho redone Date library trong Java 7. Trong khi tôi không sử dụng nó nhiều, tôi đã nghe không có gì ngoài những điều tốt đẹp về nó và nếu ngày của bạn thao tác rộng rãi trong các dự án của bạn vào.


3
2018-05-19 12:45



Joda là tốt! Yay! - Steve McLeod


Cách đơn giản để định dạng 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 có định dạng dd / mm / dd: 21/10/2015


1
2017-10-21 05:35





A Date đối tượng có không định dạng, nó là một đại diện. Ngày có thể được trình bày bởi một String với định dạng bạn thích.

Ví dụ. "yyyy-MM-dd","yy-MMM-dd","dd-MMM-yy" và vân vân.

Để đạt được điều này, bạn có thể sử dụng SimpleDateFormat

Thử cái này,

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

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

        try {
            Date dateFromUser = fromUser.parse(inputString); // Parse it to the exisitng date pattern and return Date type
            String dateMyFormat = myFormat.format(dateFromUser); // format it to the date pattern you prefer
            System.out.println(dateMyFormat); // outputs : 2009-05-19

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

Kết quả này: 2009-05-19


0
2017-07-25 05:05