วิธีจัดรูปแบบ Joda-Time DateTime ให้เป็น mm / dd / yyyy เท่านั้น


189

ฉันมีสตริง " 11/15/2013 08:00:00" ฉันต้องการจัดรูปแบบเป็น " 11/15/2013" DateTimeFormatterรูปแบบที่ถูกต้องคืออะไร

ฉันลองหลายครั้งแล้วก็ Google และยังหารูปแบบที่ไม่ถูกต้อง

แก้ไข: ฉันกำลังมองหาJoda-Time DateTimeFormatterไม่ใช่ SimpleDateFormat ของ Java


2
tl; dr: DateTimeFormat.forPattern ("MM / dd / yyyy HH: mm: ss"). พิมพ์ (DateTime.now ())
แอนดรู

คำตอบ:


386

เวลา Joda

สร้างDateTimeFormatterโดยใช้DateTimeFormat.forPattern(String)

ใช้ Joda เวลาคุณจะทำเช่นนี้:

String dateTime = "11/15/2013 08:00:00";
// Format for input
DateTimeFormatter dtf = DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss");
// Parsing the date
DateTime jodatime = dtf.parseDateTime(dateTime);
// Format for output
DateTimeFormatter dtfOut = DateTimeFormat.forPattern("MM/dd/yyyy");
// Printing the date
System.out.println(dtfOut.print(jodatime));

Java มาตรฐาน≥ 8

Java 8 แนะนำไลบรารี Date and Timeใหม่ทำให้ง่ายต่อการจัดการกับวันที่และเวลา หากคุณต้องการที่จะใช้มาตรฐาน Java รุ่น 8 หรือเกินกว่าที่คุณจะใช้DateTimeFormatter เนื่องจากคุณไม่ได้มีโซนเวลาในของคุณStringเป็นjava.time.LocalDateTimeหรือLOCALDATEมิฉะนั้นเวลาส่วนพันธุ์ZonedDateTimeและZonedDateสามารถนำมาใช้

// Format for input
DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
// Parsing the date
LocalDate date = LocalDate.parse(dateTime, inputFormat);
// Format for output
DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy");
// Printing the date
System.out.println(date.format(outputFormat));

Java มาตรฐาน <8

ก่อนหน้า Java 8 คุณจะต้องใช้SimpleDateFormatและjava.util.Date

String dateTime = "11/15/2013 08:00:00";
// Format for input
SimpleDateFormat dateParser = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
// Parsing the date
Date date7 = dateParser.parse(dateTime);
// Format for output
SimpleDateFormat dateFormatter = new SimpleDateFormat("MM/dd/yyyy");
// Printing the date
System.out.println(dateFormatter.format(date7));

7
ขอโทษด้วย แต่ฉันกำลังมองหา DateTimeFormatter ของ jodatime
iCodeLikeImDrunk

1
@yaojiang Joda SimpleDateFormatใช้ไวยากรณ์เดียวกันสตริงรูปแบบเป็น อ่านเอกสาร API
Jesper

@yaojiang ตามที่ Jesper พูดถึง Joda ใช้สตริงการจัดรูปแบบเดียวกันแม้ว่าจะมีตัวเลือกเพิ่มเติม ฉันได้ขยายตัวอย่างเพื่อรวม Joda อย่างที่คุณเห็นมันคล้ายกันมาก
DeltaLima

ฉันใช้ DateTimeFormatter dtf = DateTimeFormat.forPattern ("MM / dd / yyyy") แปลก ๆ ; และฉันยังได้รับ "mm / dd / yyyy hh: mm: ss" ...
iCodeLikeImDrunk

2
ในขณะที่ Joda-Time ใช้รหัสการจัดรูปแบบที่คล้ายกันมากเช่น java.util.Date/Calendar ให้อ่านเอกสารอย่างละเอียดเพื่อดูความแตกต่างเล็กน้อย พวกเขาไม่เหมือนกัน
Basil Bourque

45

ฉันกำลังเพิ่มที่นี่แม้ว่าคำตอบอื่น ๆ จะยอมรับได้อย่างสมบูรณ์ JodaTime มีตัวแยกวิเคราะห์ที่สร้างไว้ล่วงหน้าใน DateTimeFormat:

dateTime.toString(DateTimeFormat.longDate());

นี่คือตัวเลือกส่วนใหญ่ที่พิมพ์ด้วยรูปแบบ:

shortDate:         11/3/16
shortDateTime:     11/3/16 4:25 AM
mediumDate:        Nov 3, 2016
mediumDateTime:    Nov 3, 2016 4:25:35 AM
longDate:          November 3, 2016
longDateTime:      November 3, 2016 4:25:35 AM MDT
fullDate:          Thursday, November 3, 2016
fullDateTime:      Thursday, November 3, 2016 4:25:35 AM Mountain Daylight Time

1
ดีความคิดใดว่ารุ่นนี้ถูกนำมาใช้? ประหยัดเวลาได้มากโดยไม่สร้างสตริงรูปแบบที่โง่ ...
iCodeLikeImDrunk

ใช่ฉันเห็นด้วยทั้งหมด ดูเหมือนว่ามันจะอยู่ที่นั่นเสมอ joda-time.sourceforge.net/apidocs/org/joda/time/format/…
Chad Bingham

21
DateTime date = DateTime.now().withTimeAtStartOfDay();
date.toString("HH:mm:ss")

1
สิ่งนี้มีประโยชน์แม้ว่าจะไม่ได้ตอบคำถาม รุ่นหนึ่งบรรทัด:DateTime.now().toString("HH:mm:ss")
hBrent

11

ฉันคิดว่ามันจะใช้งานได้ถ้าคุณใช้ JodaTime:

String strDateTime = "11/15/2013 08:00:00";
DateTime dateTime = DateTime.parse(strDateTime);
DateTimeFormatter fmt = DateTimeFormat.forPattern("MM/dd/YYYY");
String strDateOnly = fmt.print(dateTime);

ผมได้เป็นส่วนหนึ่งของนี้จากที่นี่


ลิงก์ไปยังเอกสารของคุณล้าสมัยแล้ว URL ที่ถูกต้องคือ: joda.org/joda-time/apidocs/org/joda/time/format/…
Basil Bourque

1
@BasilBourque ขอบคุณที่ชี้ให้เห็นว่าDเป็นวันของปี แต่ "ลิงก์ไปยังเอกสาร" ของฉันไม่ล้าสมัย: เอกสารที่ฉันเชื่อมโยงนั้นล้าสมัย ฉันไม่ได้เชื่อมโยงไปยังเอกสารเพื่อประโยชน์ของตัวเองฉันกำลังเชื่อมโยงไปยังหน้าที่ฉันได้รับรหัสจาก - ซึ่งเกิดขึ้นเป็นเอกสารที่ล้าสมัย
ผู้ชายกับหมวก

10

ฉันมีตัวเลือกที่โง่ แต่ทำงานได้ ถ้าคุณมี String fullDate = "11/15/2013 08:00:00";

   String finalDate = fullDate.split(" ")[0];

ที่ควรทำงานง่ายและรวดเร็ว :)


ใช่ฉันจะเปลี่ยนรูปแบบแน่นอน ใช้งานได้ แต่ในกรณีนี้เท่านั้น
iCodeLikeImDrunk

1
พฤติกรรมที่ไม่ได้คาดหวังจริงๆหลังจากนั้นไม่มีใคร (รวมถึงคุณ) ที่ดูรหัสของคุณไม่เข้าใจสิ่งที่คุณทำที่นี่ ...
Sercan Ozdemir

3

UPDATED:

คุณสามารถ: สร้างค่าคงที่:

private static final DateTimeFormatter DATE_FORMATTER_YYYY_MM_DD =
          DateTimeFormat.forPattern("yyyy-MM-dd"); // or whatever pattern that you need.

DateTimeFormat นี้กำลังนำเข้าจาก: (โปรดระวังด้วย)

นำเข้า org.joda.time.format.DateTimeFormat; นำเข้า org.joda.time.format.DateTimeFormatter;

แยกวิเคราะห์วันที่ด้วย:

DateTime.parse(dateTimeScheduled.toString(), DATE_FORMATTER_YYYY_MM_DD);

ก่อน:
DateTime.parse ("201711201515", DateTimeFormat.forPattern ("yyyyMMDdHHmm"))) toString ("yyyyMMdd");

ถ้าต้องการ datetime:

DateTime.parse("201711201515", DateTimeFormat.forPattern("yyyyMMddHHmm")).withTimeAtStartOfDay();

2

วิธีนี้ใช้ได้ผล

String x = "22/06/2012";
String y = "25/10/2014";

String datestart = x;
String datestop = y;

//DateTimeFormatter format = DateTimeFormat.forPattern("dd/mm/yyyy");
SimpleDateFormat  format = new SimpleDateFormat("dd/mm/yyyy");

Date d1 = null;
Date d2 = null;

try {
    d1 =  format.parse(datestart);
    d2 = format.parse(datestop);

    DateTime dt1 = new DateTime(d1);
    DateTime dt2 = new DateTime(d2);

    //Period
    period = new Period (dt1,dt2);

    //calculate days
    int days = Days.daysBetween(dt1, dt2).getDays();


} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

1

อีกวิธีในการทำนั่นคือ:

String date = dateAndTime.substring(0, dateAndTime.indexOf(" "));

ฉันไม่แน่ใจ แต่ฉันคิดว่านี่อาจเร็วกว่า / ใช้หน่วยความจำน้อยกว่าการใช้.split()วิธีนี้

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