วันที่ปฏิทินเป็นรูปแบบ yyyy-MM-dd ใน java


210

วิธีแปลงวันที่ในปฏิทินเป็นyyyy-MM-ddรูปแบบ

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

inActiveDate = Wed Sep 26 00:00:00 IST 2012นี้จะผลิต 2012-09-26แต่สิ่งที่ผมต้องการคือ จุดประสงค์ของฉันคือการเปรียบเทียบวันที่นี้กับวันที่อื่นในฐานข้อมูลของฉันโดยใช้เกณฑ์ Hibernate ดังนั้นฉันต้องการวัตถุวันที่ในyyyy-MM-ddรูปแบบ


5
รหัสของคุณสับสน คุณพยายามที่จะจัดรูปแบบDateการyyyy-MM-ddหรือแยกสตริงจากyyyy-MM-ddไปDateค่า ?? ในการจัดรูปแบบวันที่เพียงใช้format1.format(date)การแยกวิเคราะห์ใช้format1.parse(someStringValueInTheCorrectFormat)
MadProgrammer

ฉันได้แก้ไขคำถามของฉัน .. ขออภัยสำหรับข้อผิดพลาดก่อนหน้านี้ ..
Sarika.S

9
สายการบินหนึ่ง:( new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" ) ).format( Calendar.getInstance().getTime() );
Iwan Aucamp

คำตอบ:


342

Java Dateเป็นที่เก็บสำหรับจำนวนมิลลิวินาทีตั้งแต่ 1 มกราคม 1970, 00:00:00 GMT

เมื่อคุณใช้บางอย่างเช่นSystem.out.println(date)Java ใช้Date.toString()ในการพิมพ์เนื้อหา

วิธีเดียวที่จะเปลี่ยนก็คือการแทนที่และให้การดำเนินงานของคุณเองDate Date.toString()ตอนนี้ก่อนที่คุณจะจุดระเบิด IDE ของคุณและลองสิ่งนี้ฉันจะไม่; มันจะซับซ้อนเท่านั้น คุณดีกว่าการจัดรูปแบบวันที่เป็นรูปแบบที่คุณต้องการใช้ (หรือแสดง)

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

ก่อนหน้าจาวา 8

คุณควรใช้ThreeTen Backport

ข้อมูลต่อไปนี้ได้รับการปรับปรุงเพื่อวัตถุประสงค์ทางประวัติศาสตร์ (ตามคำตอบดั้งเดิม)

สิ่งที่คุณสามารถทำได้คือจัดรูปแบบวันที่

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"

อันที่จริงแล้วเป็นวันที่เดียวกัน


1
ชนิด แต่มันง่ายขึ้นมากด้วยCalendar
MadProgrammer

1
จะลบเขตเวลาทั้งหมดออกจากวัตถุปฏิทินนี้ได้อย่างไร
Sarika.S

2
หากคุณจริงจังกับการจัดการวันที่ / เวลาจริงๆลองดูJoda Timeมันจะง่ายกว่าถ้าคุณยุ่งกับมันมากCalendar
MadProgrammer

2
@ n13 หากคำถามเกี่ยวกับการจัดการวันฐานข้อมูลหรือแม้กระทั่งการจัดการเวลาฉันอาจเห็นด้วยกับคุณ คำถามคือวิธีการแสดงค่าวันที่ในรูปแบบวันที่ที่เฉพาะเจาะจง
MadProgrammer

1
คำตอบที่มีโครงสร้างดี - นี่คือการแยกแบบจำลอง (วันที่) -View (รูปแบบ)
YoYo

19

รหัสของคุณผิด ไม่มีวันที่แยกวิเคราะห์และเก็บเป็นวัตถุวันที่

คุณสามารถจัดรูปแบบวัตถุวันที่ปฏิทินเมื่อคุณต้องการที่จะแสดงและเก็บไว้เป็นสตริง

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

คำตอบโดย MadProgrammerถูกต้องโดยเฉพาะอย่างยิ่งเกี่ยวกับเคล็ดลับJoda เวลา สืบเพื่อ Joda เวลาที่ถูกสร้างขึ้นในขณะนี้เป็นJava 8เป็นใหม่แพคเกจ java.time นี่คือตัวอย่างโค้ดใน Java 8

เมื่อทำงานกับวันที่ - เวลา (ตรงข้ามกับวันที่ท้องถิ่น), เขตเวลาสำคัญ วันของเดือนขึ้นอยู่กับเขตเวลา ตัวอย่างเช่นเขตเวลาของอินเดียคือ+05:30(ล่วงหน้าห้าชั่วโมงครึ่งก่อนเวลา UTC) ในขณะที่ฝรั่งเศสอยู่ข้างหน้าเพียงหนึ่งชั่วโมง ดังนั้นช่วงเวลาในวันใหม่ในอินเดียจึงมีหนึ่งวันในขณะที่ช่วงเวลาเดียวกันในฝรั่งเศสมีวันที่ "เมื่อวาน" การสร้างเอาต์พุตสตริงที่ไม่มีเขตเวลาใด ๆ หรือข้อมูลออฟเซ็ตกำลังสร้างความคลุมเครือ คุณขอเอาต์พุต YYYY-MM-DD ดังนั้นฉันจึงให้ แต่ฉันไม่แนะนำ แทนที่จะใช้ISO_LOCAL_DATEฉันจะได้ISO_DATEรับผลลัพธ์นี้: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 );

ถ่ายโอนข้อมูลไปยังคอนโซล ...

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

เมื่อวิ่ง ...

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

Joda เวลา

โค้ดที่คล้ายกันโดยใช้ไลบรารีJoda-Timeซึ่งเป็นตัวตั้งต้นถึง java.time

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

ISO 8601

โดยวิธีการรูปแบบของสายป้อนของคุณที่เป็นรูปแบบมาตรฐานหนึ่งในหลาย ๆ ที่มีประโยชน์วันเวลาของรูปแบบสตริงที่กำหนดโดยมาตรฐาน ISO 8601

ทั้ง Joda-Time และ java.time ใช้รูปแบบ ISO 8601 ตามค่าเริ่มต้นเมื่อแยกวิเคราะห์และสร้างการแทนค่าสตริงของค่าวันที่และเวลาต่างๆ


6

java.util.Dateวัตถุที่ไม่สามารถเป็นตัวแทนวันในที่กำหนดเองรูปแบบแทนคุณได้ใช้วิธีการที่ผลตอบแทนSimpleDateFormat.formatstring

String myString=format1.format(date);

2

ในการแยกวิเคราะห์java.util.Dateวัตถุคุณต้องแปลงเป็น String ก่อนโดยใช้รูปแบบของคุณเอง

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

แต่ฉันเชื่อว่าคุณซ้ำซ้อนที่นี่


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

นี่จะแสดงวันที่ของคุณ + 7 วันในเดือนรูปแบบวันและปีในบานหน้าต่างหน้าต่าง 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
ยินดีต้อนรับสู่ SO โปรดเพิ่มบริบท / คำอธิบายเนื่องจากรหัสคำตอบเท่านั้นไม่เป็นไปตามมาตรฐานของเรา ดูstackoverflow.com/help/how-to-answer
Uwe Allner

0

ฉันพบรหัสนี้ที่มีการเปรียบเทียบวันที่ในรูปแบบเพื่อเปรียบเทียบกับเขตข้อมูลวันที่ในฐานข้อมูล ... อาจเป็นประโยชน์กับคุณ ...

เมื่อคุณแปลงสตริงเป็น date โดยใช้ simpledateformat มันยากที่จะเปรียบเทียบกับฟิลด์ Date ในฐานข้อมูล mysql

ดังนั้นแปลงวันที่ของสตริง java ในรูปแบบโดยใช้เลือก STR_to_DATE ('yourdate', '% m /% d /% Y') -> ในรูปแบบนี้จากนั้นคุณจะได้รับรูปแบบวันที่แน่นอนของฟิลด์วันที่ mysql

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


3
คำตอบสำหรับลิงก์อย่างเดียวนั้นไม่ได้รับการสนับสนุนใน StackOverflow เนื่องจากลิงก์เน่าและปัญหาอื่น ๆ คุณสามารถให้ข้อมูลสรุปพร้อมประเด็นสำคัญได้หรือไม่?
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;
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.