java.util.Date การแปลงรูปแบบวันที่ yyyy-mm-dd เป็น mm-dd-yyyy


89

ฉันมีในรูปแบบjava.util.Date yyyy-mm-ddฉันต้องการให้อยู่ในรูปแบบmm-dd-yyyy

ด้านล่างนี้คือเครื่องมือตัวอย่างที่ฉันทดลองใช้สำหรับการแปลงนี้:

// 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);

ผลลัพธ์ที่ฉันได้รับยังไม่อยู่ในรูปแบบ mm-dd-yyyyยังคงส่งออกฉันได้รับไม่ได้อยู่ในรูปแบบ

โปรดแจ้งให้เราทราบวิธีการจัดรูปแบบjava.util.Dateจากyyyy-mm-ddเป็นmm-dd-yyyy


2
คุณหมายถึงอะไรเมื่อคุณพูดว่า .. ฉันมี java.util.Date ในรูปแบบ yyyy-mm-dd?
Jayamohan

มันหมายถึงรูปแบบที่อยู่ในรหัสของฉันสำหรับการแสดงมัน UI yyyy-mm-ddเป็น
user182944

1
โปรดเปลี่ยน mm ขนาดเล็กเป็น MM
Dilip D

คำตอบ:


159

Date เป็นคอนเทนเนอร์สำหรับจำนวนมิลลิวินาทีตั้งแต่ยุค Unix (00:00:00 UTC ของวันที่ 1 มกราคม 1970)

ไม่มีแนวคิดเรื่องรูปแบบ

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);

เอาท์พุต ...

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

Java 7-

คุณควรใช้ประโยชน์จากThreeTen Backport

คำตอบเดิม

ตัวอย่างเช่น...

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);

เอาท์พุต ...

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

ไม่มีการจัดรูปแบบใดที่เปลี่ยนแปลงDateค่าพื้นฐาน นี่คือจุดประสงค์ของDateFormatters

อัปเดตด้วยตัวอย่างเพิ่มเติม

ในกรณีที่ตัวอย่างแรกไม่สมเหตุสมผล ...

ตัวอย่างนี้ใช้สองรูปแบบเพื่อจัดรูปแบบวันที่เดียวกัน จากนั้นฉันใช้รูปแบบเดียวกันนี้เพื่อแยกวิเคราะห์Stringค่ากลับเป็นDates การแยกวิเคราะห์ผลลัพธ์ไม่ได้เปลี่ยนวิธีDateรายงานมูลค่า

Date#toStringเป็นเพียงการถ่ายโอนเนื้อหา คุณไม่สามารถเปลี่ยนแปลงได้ แต่คุณสามารถจัดรูปแบบDateวัตถุได้ตามต้องการ

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();
}

เอาท์พุตใด ...

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

นอกจากนี้ควรระวังรูปแบบรูปแบบ ใช้เวลามองใกล้ที่SimpleDateFormatจะทำให้แน่ใจว่าคุณไม่ได้ใช้รูปแบบการผิด;)


คำตอบที่ดีช่วยฉัน กำลังพยายามเรียกใช้แอปตัวอย่างบรรทัดคำสั่งเพื่อทดสอบรูปแบบ (ก่อนใช้ในคลาส Android) ไม่พบการนำเข้าที่ฉันต้องการ ไม่มีคำตอบใดที่ให้ไว้อย่าลืมว่า: import java.text.SimpleDateFormat;
raddevus

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

แทน

SimpleDateFormat("mm-dd-yyyy");

เพราะMM points Month,mm points minutes

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

นอกเหนือจากการเปลี่ยนแปลงนี้แล้วการเปลี่ยนแปลงอื่นใดที่ฉันต้องทำในวิธีการใช้งานข้างต้น ฉันไม่สามารถทดสอบได้ในทันทีจึงถามสิ่งนี้ นอกจากนี้ยังมีวิธีที่ดีกว่าในการจัดรูปแบบjava.util.Dateหรือไม่
user182944

15

'M' (Capital) แทนเดือน & 'm' (Simple) แทนนาที

ตัวอย่างบางเดือน

'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' -> 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" )
)

รายละเอียด

ฉันมี java.util.Date ในรูปแบบ yyyy-mm-dd

ดังที่ได้กล่าวไปแล้วDateคลาสนี้ไม่มีรูปแบบ มีหน่วยนับเป็นมิลลิวินาทีนับตั้งแต่ต้นปี 1970 ใน UTC ไม่มีสตริงที่แนบมา

java.time

คำตอบอื่น ๆ ใช้คลาสวันที่และเวลาดั้งเดิมที่มีปัญหาซึ่งตอนนี้ถูกแทนที่ด้วยคลาส java.time

หากคุณมีให้java.util.Dateแปลงเป็นInstantวัตถุ Instantชั้นหมายถึงช่วงเวลาบนไทม์ไลน์ในส่วนUTCมีความละเอียดของนาโนวินาที (ถึงเก้า (9) ตัวเลขของส่วนทศนิยม)

Instant instant = myUtilDate.toInstant();

เขตเวลา

คำตอบอื่น ๆ ไม่สนใจประเด็นสำคัญของเขตเวลา การกำหนดวันที่ต้องใช้เขตเวลา ในช่วงเวลาใดวันที่จะแตกต่างกันไปทั่วโลกตามโซน ไม่กี่นาทีหลังเที่ยงคืนในปารีสฝรั่งเศสเป็นวันใหม่ในขณะที่ "เมื่อวาน" ยังอยู่ในMontréalQuébec

Instantกำหนดโซนเวลาที่คุณต้องการบริบทของคุณ

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

สมัครZoneIdเพื่อรับไฟล์ZonedDateTime.

ZonedDateTime zdt = instant.atZone( z );

LocalDate

หากคุณสนใจเฉพาะวันที่โดยไม่มีช่วงเวลาของวันให้แยกไฟล์LocalDate.

LocalDate localDate = zdt.toLocalDate();

ในการสร้างสตริงในรูปแบบ ISO 8601 มาตรฐานปปปป - ดด - ววtoString. คลาส java.time ใช้รูปแบบมาตรฐานตามค่าเริ่มต้นเมื่อสร้าง / แยกวิเคราะห์สตริง

String output = localDate.toString();

2017-01-23

หากคุณต้องการรูปแบบ MM-DD-YYYY ให้กำหนดรูปแบบการจัดรูปแบบ

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

โปรดทราบว่าโค้ดรูปแบบการจัดรูปแบบจะคำนึงถึงขนาดตัวพิมพ์ รหัสในคำถามใช้ไม่ถูกต้องmm(นาทีของชั่วโมง) แทนที่จะเป็นMM(เดือนของปี)

ใช้DateTimeFormatterวัตถุเดียวกันสำหรับการแยกวิเคราะห์ คลาส java.time เป็นเธรดที่ปลอดภัยดังนั้นคุณสามารถเก็บอ็อบเจ็กต์นี้ไว้รอบ ๆ และนำมาใช้ซ้ำได้แม้ข้ามเธรด

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

เกี่ยวกับ java.time

java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date, CalendarและSimpleDateFormatและ

โครงการJoda-Timeขณะนี้อยู่ในโหมดการบำรุงรักษาแนะนำให้ย้ายไปที่คลาสjava.time

ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปกJSR 310

จะหาคลาส java.time ได้ที่ไหน?

  • Java SE 8และ SE 9และใหม่กว่า
    • ในตัว.
    • ส่วนหนึ่งของ Java API มาตรฐานพร้อมการใช้งานแบบรวม
    • Java 9 เพิ่มคุณสมบัติและการแก้ไขเล็กน้อย
  • Java SE 6และ SE 7
    • มากของการทำงาน java.time จะกลับรังเพลิง Java 6 และ 7 ในThreeTen-ย้ายกลับ
  • Android

โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โปรเจ็กต์นี้เป็นพื้นที่พิสูจน์สำหรับการเพิ่ม java.time ในอนาคต คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval, YearWeek, YearQuarterและอื่น ๆ อีกมากมาย


1

ใช้งานง่ายด้านล่างรหัส

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) รหัสนี้จะไม่สนใจประเด็นสำคัญของเขตเวลา (B) รหัสนี้ใช้คลาสวันเวลาเก่าที่ยุ่งยากซึ่งเป็นมรดกตกทอดมาหลายปีแล้ว หลีกเลี่ยงพวกเขา จัดหาโดยคลาส java.time
Basil Bourque

1

คุณอาจได้รับวันเดือนและปีและอาจเชื่อมต่อกันหรืออาจใช้รูปแบบ MM-dd-yyyy ตามที่ระบุด้านล่าง

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

โปรดเปลี่ยนเดือนขนาดเล็ก "มม." ให้เป็น "MM" ซึ่งจะใช้งานได้สำหรับการอ้างอิงด้านล่างคือรหัสตัวอย่าง

        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);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.