Lịch ngày đến định dạng yyyy-MM-dd trong java


210

Làm thế nào để chuyển đổi ngày dương lịch sang yyyy-MM-ddđịnh dạng.

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
Date date = cal.getTime();             
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
String date1 = format1.format(date);            
Date inActiveDate = null;
try {
    inActiveDate = format1.parse(date1);
} catch (ParseException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

Điều này sẽ sản xuất inActiveDate = Wed Sep 26 00:00:00 IST 2012. Nhưng những gì tôi cần là 2012-09-26. Mục đích của tôi là so sánh ngày này với một ngày khác trong cơ sở dữ liệu của tôi bằng tiêu chí Hibernate. Vì vậy, tôi cần các đối tượng ngày ở yyyy-MM-ddđịnh dạng.


5
Mã của bạn là khó hiểu. Bạn đang cố gắng để định dạng một Dateđến yyyy-MM-ddhoặc phân tích một chuỗi từ yyyy-MM-ddmột Dategiá trị ?? Để định dạng ngày, chỉ cần sử dụng format1.format(date), để phân tích ngày, sử dụngformat1.parse(someStringValueInTheCorrectFormat)
MadProgrammer

Tôi đã chỉnh sửa câu hỏi của mình .. Xin lỗi vì lỗi trước đó ..
Sarika.S

9
một lớp lót:( new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" ) ).format( Calendar.getInstance().getTime() );
Iwan Aucamp

Câu trả lời:


342

Java Datelà một thùng chứa cho số mili giây kể từ ngày 1 tháng 1 năm 1970, 00:00:00 GMT.

Khi bạn sử dụng một cái gì đó như System.out.println(date), Java sử dụng Date.toString()để in nội dung.

Cách duy nhất để thay đổi nó là ghi đè Datevà cung cấp triển khai của riêng bạn Date.toString(). Bây giờ trước khi bạn khởi động IDE của mình và thử nó, tôi sẽ không; nó sẽ chỉ làm phức tạp vấn đề Bạn nên định dạng ngày theo định dạng bạn muốn sử dụng (hoặc hiển thị).

Java 8+

LocalDateTime ldt = LocalDateTime.now().plusDays(1);
DateTimeFormatter formmat1 = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH);
System.out.println(ldt);
// Output "2018-05-12T17:21:53.658"

String formatter = formmat1.format(ldt);
System.out.println(formatter);
// 2018-05-12

Trước Java 8

Bạn nên sử dụng Backt ThreeTen

Sau đây được duy trì cho mục đích lịch sử (như câu trả lời ban đầu)

Những gì bạn có thể làm, là định dạng ngày.

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(cal.getTime());
// Output "Wed Sep 26 14:23:28 EST 2012"

String formatted = format1.format(cal.getTime());
System.out.println(formatted);
// Output "2012-09-26"

System.out.println(format1.parse(formatted));
// Output "Wed Sep 26 00:00:00 EST 2012"

Đây thực sự là cùng một ngày, đại diện khác nhau.


1
Loại, nhưng nó dễ dàng hơn nhiều vớiCalendar
MadProgrammer

1
Dù sao để loại bỏ hoàn toàn múi giờ khỏi đối tượng lịch này?
Sarika.S

2
Nếu bạn thực sự nghiêm túc về thao túng ngày / giờ, hãy xem Joda Time , nó dễ dàng hơn đáng kể sau đó gây rối vớiCalendar
MadProgrammer

2
@ n13 nếu câu hỏi là về thao tác ngày cơ sở dữ liệu hoặc thậm chí thao tác thời gian tôi có thể đồng ý với bạn. Câu hỏi là làm thế nào để biểu thị một giá trị ngày theo định dạng ngày cụ thể
MadProgrammer

1
Câu trả lời có cấu trúc độc đáo - về cơ bản đây là phân tách Model (Ngày) -View (Format).
YoYo

19

Mã của bạn sai. Không có điểm phân tích ngày và giữ đó là đối tượng Ngày.

Bạn có thể định dạng đối tượng ngày lịch khi bạn muốn hiển thị và giữ nó dưới dạng chuỗi.

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
Date date = cal.getTime();             
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");          
String inActiveDate = null;
try {
    inActiveDate = format1.format(date);
    System.out.println(inActiveDate );
} catch (ParseException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

13

java.time

Câu trả lời của MadProgrammer là chính xác, đặc biệt là mẹo về Joda-Time . Sự kế thừa cho Joda-Time hiện được tích hợp vào Java 8 dưới dạng gói java.time mới . Đây là mã ví dụ trong Java 8.

Khi làm việc với thời gian ngày (trái ngược với ngày địa phương), múi giờ rất quan trọng. Ngày trong tháng phụ thuộc vào múi giờ. Ví dụ, múi giờ Ấn Độ+05:30(năm giờ rưỡi trước UTC), trong khi Pháp chỉ đi trước một giờ. Vì vậy, một khoảnh khắc trong một ngày mới ở Ấn Độ có một ngày trong khi cùng một thời điểm ở Pháp có ngày Ngày hôm qua. Tạo đầu ra chuỗi thiếu bất kỳ múi giờ hoặc thông tin bù đắp nào đang tạo ra sự mơ hồ. Bạn đã yêu cầu đầu ra YYYY-MM-DD nên tôi đã cung cấp, nhưng tôi không khuyến nghị. Thay vì ISO_LOCAL_DATEtôi đã từng sử dụng ISO_DATEđể có được đầu ra này:2014-02-25+05:30

ZoneId zoneId = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zonedDateTime = ZonedDateTime.now( zoneId );

DateTimeFormatter formatterOutput = DateTimeFormatter.ISO_LOCAL_DATE; // Caution: The "LOCAL" part means we are losing time zone information, creating ambiguity.
String output = formatterOutput.format( zonedDateTime );

Kết xuất giao diện điều khiển

System.out.println( "zonedDateTime: " + zonedDateTime );
System.out.println( "output: " + output );

Khi chạy đào

zonedDateTime: 2014-02-25T14:22:20.919+05:30[Asia/Kolkata]
output: 2014-02-25

Joda-Thời gian

Mã tương tự sử dụng thư viện Joda-Time , tiền thân của java.time.

DateTimeZone zone = new DateTimeZone( "Asia/Kolkata" );
DateTime dateTime = DateTime.now( zone );
DateTimeFormatter formatter = ISODateTimeFormat.date();
String output = formatter.print( dateTime );

ISO 8601

Nhân tiện, định dạng của chuỗi đầu vào của bạn là định dạng chuẩn, một trong một số định dạng chuỗi thời gian ngày tiện dụng được xác định bởi ISO 8601 .

Cả Joda-Time và java.time đều sử dụng định dạng ISO 8601 theo mặc định khi phân tích cú pháp và tạo các biểu diễn chuỗi của các giá trị thời gian ngày khác nhau.


6

java.util.Dateđối tượng không thể biểu thị ngày ở định dạng tùy chỉnh thay vì bạn sử dụng SimpleDateFormat.formatphương thức trả về string.

String myString=format1.format(date);

2

Để phân tích một java.util.Dateđối tượng, trước tiên bạn phải chuyển đổi nó thành Chuỗi bằng định dạng của riêng bạn.

inActiveDate = format1.parse(  format1.format(date)  );

Nhưng tôi tin rằng bạn đang dư thừa ở đây.


2
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 7);
Date date = c.getTime();
SimpleDateFormat ft = new SimpleDateFormat("MM-dd-YYYY");
JOptionPane.showMessageDialog(null, ft.format(date));

Điều này sẽ hiển thị ngày + 7 ngày theo định dạng tháng, ngày và năm trong khung cửa sổ JOption.


2
public static void main(String[] args) {
    Calendar cal = Calendar.getInstance();
    cal.set(year, month, date);
    SimpleDateFormat format1 = new SimpleDateFormat("yyyy MM dd");
    String formatted = format1.format(cal.getTime());
    System.out.println(formatted);
}

2
Chào mừng đến với SO. Vui lòng thêm một số bối cảnh / giải thích, vì mã chỉ trả lời không đáp ứng các tiêu chuẩn của chúng tôi. Xem stackoverflow.com/help/how-to-answer
Uwe Allner

0

Tôi đã tìm thấy mã này trong đó ngày được so sánh theo định dạng để so sánh với trường ngày trong cơ sở dữ liệu ... có thể điều này có thể hữu ích cho bạn ...

Khi bạn chuyển đổi chuỗi thành ngày bằng cách sử dụng Simpledateformat, thật khó để so sánh với trường Ngày trong cơ sở dữ liệu mysql.

Vì vậy, chuyển đổi ngày chuỗi java theo định dạng bằng cách sử dụng chọn STR_to_DATE ('yourdate', '% m /% d /% Y') -> ở định dạng này, sau đó bạn sẽ có được định dạng ngày chính xác của trường ngày mysql.

http://javainfinite.com/java/java-convert-opes-to-date-and-compare/


3
Các câu trả lời chỉ liên kết không được khuyến khích trên StackOverflow vì liên kết và các vấn đề khác. Bạn có thể đưa ra một bản tóm tắt của thông tin với các điểm chính?
Basil Bourque

0
public static String ThisWeekStartDate(WebDriver driver) {
        Calendar c = Calendar.getInstance();
        //ensure the method works within current month
        c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        System.out.println("Before Start Date " + c.getTime());
        Date date = c.getTime();

          SimpleDateFormat dfDate = new SimpleDateFormat("dd MMM yyyy hh.mm a");

          String CurrentDate = dfDate.format(date);
          System.out.println("Start Date " + CurrentDate);
          return CurrentDate;

    }
    public static String ThisWeekEndDate(WebDriver driver) {

        Calendar c = Calendar.getInstance();
        //ensure the method works within current month
        c.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
        System.out.println("Before End Date " + c.getTime());
        Date date = c.getTime();

          SimpleDateFormat dfDate = new SimpleDateFormat("dd MMM yyyy hh.mm a");

          String CurrentDate = dfDate.format(date);
          System.out.println("End Date " + CurrentDate);
          return CurrentDate;
    }
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.