java.util.Date chuyển đổi định dạng yyyy-mm-dd thành mm-dd-yyyy


88

Tôi có một java.util.Datetrong các định dạng yyyy-mm-dd. Tôi muốn nó ở định dạngmm-dd-yyyy

Dưới đây là mẫu sử dụng tôi đã thử cho chuyển đổi này:

// Setting the pattern
SimpleDateFormat sm = new SimpleDateFormat("mm-dd-yyyy");
// myDate is the java.util.Date in yyyy-mm-dd format
// Converting it into String using formatter
String strDate = sm.format(myDate);
//Converting the String back to java.util.Date
Date dt = sm.parse(strDate);

Vẫn có đầu ra tôi nhận được không ở định dạng mm-dd-yyyy.

Vui lòng cho tôi biết cách định dạng java.util.Datetừ yyyy-mm-ddsangmm-dd-yyyy


2
Ý bạn là gì khi bạn nói .. Tôi có java.util.Date ở định dạng yyyy-mm-dd?
Jayamohan

Nó có nghĩa là định dạng hiện tại trong mã của tôi để hiển thị nó lên UI là yyyy-mm-dd.
user182944

1
hãy thay đổi mm nhỏ để MM
Dilip D

Câu trả lời:


157

Date là vùng chứa số mili giây kể từ kỷ nguyên Unix (00:00:00 UTC vào ngày 1 tháng 1 năm 1970).

Nó không có khái niệm về định dạng.

Java 8+

LocalDateTime ldt = LocalDateTime.now();
System.out.println(DateTimeFormatter.ofPattern("MM-dd-yyyy", Locale.ENGLISH).format(ldt));
System.out.println(DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH).format(ldt));
System.out.println(ldt);

Kết quả đầu ra ...

05-11-2018
2018-05-11
2018-05-11T17:24:42.980

Java 7-

Bạn nên sử dụng Cổng nền ThreeTen

Câu trả lời gốc

Ví dụ...

Date myDate = new Date();
System.out.println(myDate);
System.out.println(new SimpleDateFormat("MM-dd-yyyy").format(myDate));
System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(myDate));
System.out.println(myDate);

Kết quả đầu ra ...

Wed Aug 28 16:20:39 EST 2013
08-28-2013
2013-08-28
Wed Aug 28 16:20:39 EST 2013

Không có định dạng nào thay đổi Dategiá trị cơ bản . Đây là mục đích của DateFormatters

Cập nhật với ví dụ bổ sung

Chỉ trong trường hợp ví dụ đầu tiên không có ý nghĩa ...

Ví dụ này sử dụng hai định dạng để định dạng cùng một ngày. Sau đó, tôi sử dụng các định dạng tương tự này để phân tích cú pháp các Stringgiá trị trở lại Dates. Phân tích cú pháp kết quả không làm thay đổi cách Datebáo cáo giá trị của nó.

Date#toStringchỉ là một bãi chứa nội dung của nó. Bạn không thể thay đổi điều này, nhưng bạn có thể định dạng Dateđối tượng theo bất kỳ cách nào bạn muốn

try {
    Date myDate = new Date();
    System.out.println(myDate);

    SimpleDateFormat mdyFormat = new SimpleDateFormat("MM-dd-yyyy");
    SimpleDateFormat dmyFormat = new SimpleDateFormat("yyyy-MM-dd");

    // Format the date to Strings
    String mdy = mdyFormat.format(myDate);
    String dmy = dmyFormat.format(myDate);

    // Results...
    System.out.println(mdy);
    System.out.println(dmy);
    // Parse the Strings back to dates
    // Note, the formats don't "stick" with the Date value
    System.out.println(mdyFormat.parse(mdy));
    System.out.println(dmyFormat.parse(dmy));
} catch (ParseException exp) {
    exp.printStackTrace();
}

Đầu ra nào ...

Wed Aug 28 16:24:54 EST 2013
08-28-2013
2013-08-28
Wed Aug 28 00:00:00 EST 2013
Wed Aug 28 00:00:00 EST 2013

Ngoài ra, hãy cẩn thận với các mẫu định dạng. Hãy xem xét kỹ hơn SimpleDateFormatđể đảm bảo rằng bạn không sử dụng sai các mẫu;)


Câu trả lời tuyệt vời đã giúp tôi. Đang cố gắng chạy một ứng dụng mẫu dòng lệnh để kiểm tra các định dạng (trước khi sử dụng trong một lớp Android) - không thể tìm thấy bản nhập mà tôi cần. Không câu trả lời nào được cung cấp nhớ bao gồm: import java.text.SimpleDateFormat;
raddevus

34
SimpleDateFormat("MM-dd-yyyy");

thay vì

SimpleDateFormat("mm-dd-yyyy");

bởi vì MM points Month,mm points minutes

SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy");
String strDate = sm.format(myDate);

Ngoài thay đổi này, tôi cần thực hiện thay đổi nào khác trong phương thức sử dụng ở trên? Tôi không thể kiểm tra nó ngay lập tức, do đó yêu cầu điều này. Ngoài ra, có cách nào tốt hơn để định dạng java.util.Datekhông?
user182944

15

'M' (Viết hoa) đại diện cho tháng và 'm' (Đơn giản) đại diện cho phút

Một số ví dụ cho tháng

'M' -> 7  (without prefix 0 if it is single digit)
'M' -> 12

'MM' -> 07 (with prefix 0 if it is single digit)
'MM' -> 12

'MMM' -> Jul (display with 3 character)

'MMMM' -> December (display with full name)

Một số ví dụ cho phút

'm' -> 3  (without prefix 0 if it is single digit)
'm' -> 19
'mm' -> 03 (with prefix 0 if it is single digit)
'mm' -> 19

3

tl; dr

LocalDate.parse( 
    "01-23-2017" , 
    DateTimeFormatter.ofPattern( "MM-dd-uuuu" )
)

Chi tiết

Tôi có java.util.Date ở định dạng yyyy-mm-dd

Như đã đề cập khác, Datelớp không có định dạng. Nó có số đếm mili giây kể từ đầu năm 1970 theo giờ UTC. Không có chuỗi đính kèm.

java.time

Các câu trả lời khác sử dụng các lớp ngày-giờ kế thừa cũ rắc rối, hiện được thay thế bằng các lớp java.time.

Nếu bạn có java.util.Date, hãy chuyển đổi thành một Instantđối tượng. Các Instantlớp đại diện cho một thời điểm trên Timeline trong UTC với độ phân giải nano giây (lên đến chín (9) chữ số của một phân số thập phân).

Instant instant = myUtilDate.toInstant();

Múi giờ

Các câu trả lời khác bỏ qua vấn đề quan trọng của múi giờ. Xác định ngày tháng cần có múi giờ. Đối với bất kỳ thời điểm nhất định nào, ngày thay đổi trên toàn cầu theo khu vực. Vài phút sau nửa đêm ở Paris Pháp là một ngày mới, trong khi vẫn là “ngày hôm qua” ở Montréal Québec.

Xác định múi giờ mà bạn muốn có ngữ cảnh cho của mình Instant.

ZoneId z = ZoneId.of( "America/Montreal" );

Áp dụng ZoneIdđể có được a ZonedDateTime.

ZonedDateTime zdt = instant.atZone( z );

LocalDate

Nếu bạn chỉ quan tâm đến ngày mà không có thời gian trong ngày, hãy trích xuất a LocalDate.

LocalDate localDate = zdt.toLocalDate();

Để tạo một chuỗi ở định dạng ISO 8601 tiêu chuẩn, YYYY-MM-DD, chỉ cần gọi toString. Các lớp java.time sử dụng các định dạng chuẩn theo mặc định khi tạo / phân tích cú pháp chuỗi.

String output = localDate.toString();

2017-01-23

Nếu bạn muốn định dạng MM-DD-YYYY, hãy xác định một mẫu định dạng.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu" );
String output = localDate.format( f );

Lưu ý rằng mã mẫu định dạng phân biệt chữ hoa chữ thường. Mã trong Câu hỏi được sử dụng không chính xác mm(phút của giờ) thay vì MM(tháng trong năm).

Sử dụng cùng một DateTimeFormatterđối tượng để phân tích cú pháp. Các lớp java.time là luồng an toàn, vì vậy bạn có thể giữ đối tượng này xung quanh và tái sử dụng nó nhiều lần ngay cả trên các luồng.

LocalDate localDate = LocalDate.parse( "01-23-2017" , f );

Giới thiệu về java.time

Các java.time khung được xây dựng vào Java 8 và sau đó. Những lớp học thay thế cái cũ phiền hà di sản lớp học ngày thời gian như java.util.Date, Calendar, & SimpleDateFormat.

Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang các java.time lớp.

Để 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 .

Lấy các lớp java.time ở đâu?

  • Java SE 8 SE 9 trở lên
    • Được xây dựng trong.
    • Một phần của API Java tiêu chuẩn với một triển khai đóng gói.
    • Java 9 bổ sung một số tính năng nhỏ và các bản sửa lỗi.
  • Java SE 6 SE 7
    • Phần lớn chức năng của java.time được chuyển ngược sang Java 6 & 7 trong ThreeTen-Backport .
  • Android

Các ThreeTen-Extra dự án mở rộng java.time với các lớp bổ sung. Dự án này là cơ sở chứng minh cho những bổ sung có thể có trong tương lai cho java.time. Bạn có thể tìm thấy một số các lớp học hữu ích ở đây chẳng hạn như Interval, YearWeek, YearQuarter, và nhiều hơn nữa .


1

Nó là đơn giản sử dụng mã dưới đây.

final Date todayDate = new Date();

System.out.println(todayDate);

System.out.println(new SimpleDateFormat("MM-dd-yyyy").format(todayDate));

System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(todayDate));

System.out.println(todayDate);

(A) Mã này bỏ qua vấn đề quan trọng của múi giờ. (B) Mã này sử dụng các lớp ngày-giờ cũ rắc rối đã được kế thừa trong nhiều năm nay. Tránh chúng. Được thay thế bởi các lớp java.time.
Basil Bourque

1

Bạn có thể lấy ngày, tháng và năm và có thể nối chúng hoặc có thể sử dụng định dạng MM-dd-yyyy như được đưa ra bên dưới.

Date date1 = new Date();
String mmddyyyy1 = new SimpleDateFormat("MM-dd-yyyy").format(date1);
System.out.println("Formatted Date 1: " + mmddyyyy1);



Date date2 = new Date();
Calendar calendar1 = new GregorianCalendar();
calendar1.setTime(date2);
int day1   = calendar1.get(Calendar.DAY_OF_MONTH);
int month1 = calendar1.get(Calendar.MONTH) + 1; // {0 - 11}
int year1  = calendar1.get(Calendar.YEAR);
String mmddyyyy2 = ((month1<10)?"0"+month1:month1) + "-" + ((day1<10)?"0"+day1:day1) + "-" + (year1);
System.out.println("Formatted Date 2: " + mmddyyyy2);



LocalDateTime ldt1 = LocalDateTime.now();  
DateTimeFormatter format1 = DateTimeFormatter.ofPattern("MM-dd-yyyy");  
String mmddyyyy3 = ldt1.format(format1);  
System.out.println("Formatted Date 3: " + mmddyyyy3);  



LocalDateTime ldt2 = LocalDateTime.now();
int day2 = ldt2.getDayOfMonth();
int mont2= ldt2.getMonthValue();
int year2= ldt2.getYear();
String mmddyyyy4 = ((mont2<10)?"0"+mont2:mont2) + "-" + ((day2<10)?"0"+day2:day2) + "-" + (year2);
System.out.println("Formatted Date 4: " + mmddyyyy4);



LocalDateTime ldt3 = LocalDateTime.of(2020, 6, 11, 14, 30); // int year, int month, int dayOfMonth, int hour, int minute
DateTimeFormatter format2 = DateTimeFormatter.ofPattern("MM-dd-yyyy");  
String mmddyyyy5 = ldt3.format(format2);   
System.out.println("Formatted Date 5: " + mmddyyyy5); 



Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(new Date());
int day3  = calendar2.get(Calendar.DAY_OF_MONTH); // OR Calendar.DATE
int month3= calendar2.get(Calendar.MONTH) + 1;
int year3 = calendar2.get(Calendar.YEAR);
String mmddyyyy6 = ((month3<10)?"0"+month3:month3) + "-" + ((day3<10)?"0"+day3:day3) + "-" + (year3);
System.out.println("Formatted Date 6: " + mmddyyyy6);



Date date3 = new Date();
LocalDate ld1 = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date3)); // Accepts only yyyy-MM-dd
int day4  = ld1.getDayOfMonth();
int month4= ld1.getMonthValue();
int year4 = ld1.getYear();
String mmddyyyy7 = ((month4<10)?"0"+month4:month4) + "-" + ((day4<10)?"0"+day4:day4) + "-" + (year4);
System.out.println("Formatted Date 7: " + mmddyyyy7);



Date date4 = new Date();
int day5   = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getDayOfMonth();
int month5 = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getMonthValue();
int year5  = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getYear();
String mmddyyyy8 = ((month5<10)?"0"+month5:month5) + "-" + ((day5<10)?"0"+day5:day5) + "-" + (year5);
System.out.println("Formatted Date 8: " + mmddyyyy8);



Date date5 = new Date();
int day6   = Integer.parseInt(new SimpleDateFormat("dd").format(date5));
int month6 = Integer.parseInt(new SimpleDateFormat("MM").format(date5));
int year6  = Integer.parseInt(new SimpleDateFormat("yyyy").format(date5));
String mmddyyyy9 = ((month6<10)?"0"+month6:month6) + "-" + ((day6<10)?"0"+day6:day6) + "-" + (year6);`enter code here`
System.out.println("Formatted Date 9: " + mmddyyyy9);

1

Vui lòng thay đổi tháng nhỏ "mm" thành viết hoa "MM" nó sẽ hoạt động. Để tham khảo bên dưới là mã mẫu.

        Date myDate = new Date();
        SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy");
       
        String strDate = sm.format(myDate);
        
        Date dt = sm.parse(strDate);
        System.out.println(strDate);

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.