Làm cách nào để định dạng Joda-Time DateTime thành chỉ mm / dd / yyyy?


189

Tôi có một chuỗi " 11/15/2013 08:00:00", tôi muốn định dạng nó thành " 11/15/2013", DateTimeFormattermẫu chính xác là gì?

Tôi đã thử nhiều và googled và vẫn không thể tìm thấy mô hình chính xác.

chỉnh sửa: Tôi đang tìm kiếm Joda-Time DateTimeFormatter , không phải SimpleDateFormat của Java ..


2
tl; dr: DateTimeFormat.forPotype ("MM / dd / yyyy HH: mm: ss"). print (DateTime.now ())
Andrew

Câu trả lời:


385

Giờ Joda

Tạo một DateTimeFormattercách sử dụngDateTimeFormat.forPattern(String)

Sử dụng thời gian Joda bạn sẽ làm như thế này:

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 chuẩn ≥ 8

Java 8 đã giới thiệu một thư viện Ngày và Giờ mới , giúp dễ dàng xử lý ngày và giờ hơn. Nếu bạn muốn sử dụng phiên bản Java tiêu chuẩn 8 trở lên, bạn sẽ sử dụng DateTimeFormatter . Vì bạn không có múi giờ trong javaString , nên java.time.LocalDateTime hoặc LocalDate , nếu không, có thể sử dụng các giống được khoanh vùng theo thời gian ZiatedDateTimeZencedDate .

// 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 chuẩn <8

Trước Java 8, bạn sẽ sử dụng SimpleDateFormatjava.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
xin lỗi, nhưng tôi đang tìm kiếm DateTimeFormatter của jodatime.
iCodeLikeImDrunk

1
@yaojiang Joda sử dụng cú pháp chuỗi định dạng tương tự như SimpleDateFormat. Đọc tài liệu API.
Jesper

@yaojiang Như Jesper đã đề cập, Joda sử dụng các chuỗi định dạng tương tự, mặc dù nó có nhiều tùy chọn hơn. Tôi đã mở rộng ví dụ để bao gồm Joda, vì bạn có thể thấy nó rất giống nhau.
DeltaLima

kỳ lạ là tôi đang sử dụng DateTimeFormatter dtf = DateTimeFormat.forPotype ("MM / dd / yyyy"); và tôi vẫn nhận được "mm / dd / yyyy hh: mm: ss" ...
iCodeLikeImDrunk

2
Mặc dù Joda-Time sử dụng các mã định dạng rất giống như java.util.Date/CalWiki, hãy đọc tài liệu một cách cẩn thận để có sự khác biệt tinh tế. Chúng không giống nhau.
Basil Bourque

45

Tôi đang thêm điều này ở đây mặc dù các câu trả lời khác là hoàn toàn chấp nhận được. JodaTime có các trình phân tích cú pháp được tích hợp sẵn trong DateTimeFormat:

dateTime.toString(DateTimeFormat.longDate());

Đây là hầu hết các tùy chọn được in ra với định dạng của chúng:

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
tốt, có ý tưởng gì phiên bản này đã được giới thiệu? tiết kiệm rất nhiều thời gian bằng cách không tạo các chuỗi định dạng ngu ngốc ...
iCodeLikeImDrunk 7/11/2016

Vâng, tôi hoàn toàn đồng ý. Có vẻ như nó đã luôn ở đó. joda-time.sourceforge.net/apidocs/org/joda/time/format/ triệt
Chad Bingham

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

1
Điều này rất hữu ích, mặc dù không trả lời chính xác câu hỏi. Phiên bản một dòng:DateTime.now().toString("HH:mm:ss")
hBrent

11

Tôi nghĩ rằng điều này sẽ hoạt động, nếu bạn đang sử dụng 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);

Tôi có một phần của điều này từ đây .


Liên kết của bạn đến tài liệu đã lỗi thời. URL chính xác là: joda.org/joda-time/apidocs/org/joda/time/format/ mẹo
Basil Bourque

1
@BasilBourque Cảm ơn bạn đã chỉ ra rằng đó Dlà ngày trong năm, nhưng "liên kết đến tài liệu" của tôi không bị lỗi thời: tài liệu tôi liên kết đã hết hạn. Tôi đã không liên kết đến tài liệu này vì mục đích riêng của mình, tôi đang liên kết đến trang tôi nhận được một số mã từ hồi giáo mà tình cờ là tài liệu lỗi thời.
Chàng trai với chiếc mũ

10

Tôi có một lựa chọn rất ngu ngốc nhưng làm việc. nếu bạn có Chuỗi fullDate = "15/11/2013 08:00:00";

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

Điều đó sẽ làm việc dễ dàng và nhanh chóng. :)


Vâng, tôi chắc chắn sẽ thay đổi định dạng xung quanh. Điều này hoạt động nhưng chỉ cho trường hợp này.
iCodeLikeImDrunk

1
Hành vi không thực sự được mong đợi, sau đó không có ai (bao gồm cả bạn), người nhìn mã của bạn không hiểu bạn đã làm gì ở đây ...
Sercan Ozdemir

3

CẬP NHẬT:

Bạn có thể: tạo một hằng số:

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

DateTimeFormat này đang nhập từ: (hãy cẩn thận với điều đó)

nhập org.joda.time.format.DateTimeFormat; nhập org.joda.time.format.DateTimeFormatter;

Phân tích ngày với:

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

Trước:
DateTime.parse ("201711201515", DateTimeFormat.forPotype ("yyyyMMddHHmm")). ToString ("yyyyMMdd");

nếu muốn datetime:

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

2

Những công việc này

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

Một cách khác để làm điều đó là:

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

Tôi không chắc chắn chính xác, nhưng tôi nghĩ rằng điều này có thể nhanh hơn / sử dụng ít bộ nhớ hơn so với sử dụng .split()phương pháp.

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.