Định dạng ngày trong Java - bao gồm các ký tự bổ sung


88

Có định dạng kiểu php date () tương đương trong Java không? Ý tôi là, trong php, tôi có thể ký tự thoát ngược dấu gạch chéo ngược để chúng được xử lý theo nghĩa đen. Tức là yyyy \ y \ e \ a \ r sẽ trở thành năm 2010 . Tôi không tìm thấy bất kỳ điều gì tương tự trong Java, tất cả các ví dụ chỉ giải quyết các định dạng ngày được tích hợp sẵn.

Đặc biệt, tôi xử lý các bộ chọn ngày trong JCalendarthuộc tính dateFormatString của chúng .

Tôi cần nó vì trong ngôn ngữ của tôi, bắt buộc phải viết tất cả các loại nội dung bổ sung ở định dạng ngày tháng, như d. (cho ngày) sau phần ngày, m. (trong nhiều năm) sau nhiều năm một phần, v.v. Trong trường hợp xấu nhất, tôi có thể sử dụng string Replace hoặc regexp nhưng có thể có một cách đơn giản hơn? Cảm ơn trước!


1
Đối với bất kỳ ai đọc cuốn sách này vào năm 2019 trở lên, SimpleDateFormatlớp được sử dụng trong một vài câu trả lời nổi tiếng là rắc rối và lỗi thời từ lâu. Tránh nó. Thay vào đó, hãy sử dụng câu trả lời ngắn của Mark Jeronimus thể hiện việc sử dụng java.time, API ngày giờ hiện đại của Java .
Ole VV

Câu trả lời:


164

Chắc chắn, với SimpleDateFormat, bạn có thể bao gồm các chuỗi ký tự:

Trong chuỗi mẫu ngày và giờ, các chữ cái không được trích dẫn từ 'A' đến 'Z' và từ 'a' đến 'z' được hiểu là các mẫu tự biểu thị các thành phần của chuỗi ngày hoặc giờ. Văn bản có thể được trích dẫn bằng dấu nháy đơn (') để tránh diễn giải. "" "đại diện cho một trích dẫn duy nhất. Tất cả các ký tự khác không được giải thích; chúng chỉ đơn giản được sao chép vào chuỗi đầu ra trong quá trình định dạng hoặc khớp với chuỗi đầu vào trong quá trình phân tích cú pháp.

 "hh 'o''clock' a, zzzz"    12 o'clock PM, Pacific Daylight Time

Tuyệt vời, đó chính xác là những gì tôi cần. Đáng ngạc nhiên là tôi đã không tìm thấy điều đơn giản như vậy trong bất kỳ ví dụ nào mà tôi đã duyệt qua trên web :) Cảm ơn rất nhiều!
Sejanus

1
Làm cách nào để thoát khỏi ký tự trích dẫn? Tôi đang cố gắng làm điều gì đó với định dạng mm '. Cho biết ví dụ 46 phút như 46 '.
Sotti

3
@Sotti: 46''. Người đầu tiên thoát khỏi người thứ hai.
Thilo

1
FYI, các lớp học ngày thời gian khủng khiếp phiền hà như java.util.Date, java.util.Calendarjava.text.SimpleDateFormatbây giờ là di sản , thay thế bởi sự java.time class built vào Java 8 và sau đó.
Basil Bourque

24

Chỉ để hoàn thiện, Java 8 DateTimeFormattercũng hỗ trợ điều này:

DateTimeFormatter.ofPattern("yyyy 'year'");

6

Bạn có thể sử dụng String.format như được tài liệu trong java.util.Formatter :

Calendar c = ...;
String s = String.format("%tY year", c);
// -> s == "2010 year" or whatever the year actually is

5

java.time

Mark Jeronimus đã nói điều đó rồi. Tôi đang bổ sung thêm một chút nữa. Chỉ cần đặt văn bản được in theo nghĩa đen bên trong dấu ngoặc kép.

    DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("yyyy 'year'");
    System.out.println(LocalDate.of(2010, Month.FEBRUARY, 3).format(yearFormatter));
    System.out.println(Year.of(2010).format(yearFormatter));
    System.out.println(ZonedDateTime.now(ZoneId.of("Europe/Vilnius")).format(yearFormatter));

Đầu ra khi vừa chạy:

2010 year
2010 year
2019 year

Nếu bạn đang sử dụng a DateTimeFormatterBuilderappendPatternphương thức của nó , hãy sử dụng các dấu ngoặc kép theo cách tương tự. Hoặc sử dụng appendLiteralphương pháp của nó thay thế và không có dấu ngoặc kép.

Vậy chúng ta đặt một câu trích dẫn ở định dạng như thế nào? Hai dấu ngoặc kép tạo ra một. Không quan trọng nếu dấu nháy kép đơn nằm trong dấu nháy đơn hay không:

    DateTimeFormatter formatterWithSingleQuote = DateTimeFormatter.ofPattern("H mm'' ss\"");
    System.out.println(LocalTime.now(ZoneId.of("Europe/London")).format(formatterWithSingleQuote));

10 28 '34 "

    DateTimeFormatter formatterWithSingleQuoteInsideSingleQuotes
            = DateTimeFormatter.ofPattern("hh 'o''clock' a, zzzz", Locale.ENGLISH);
    System.out.println(ZonedDateTime.now(ZoneId.of("America/Los_Angeles"))
            .format(formatterWithSingleQuoteInsideSingleQuotes));

02 giờ sáng, Giờ ban ngày Thái Bình Dương

Tất cả các định dạng ở trên cũng có thể được sử dụng để phân tích cú pháp. Ví dụ:

    LocalTime time = LocalTime.parse("16 43' 56\"", formatterWithSingleQuote);
    System.out.println(time);

16:43:56

Các SimpleDateFormatlớp học được sử dụng khi câu hỏi này đã được hỏi gần 10 năm trước đây nổi tiếng là rắc rối và dài lỗi thời. Tôi khuyên bạn nên sử dụng java.time, API ngày và giờ hiện đại của Java. Đó là lý do tại sao tôi chứng minh điều đó.

Liên kết


-4

java.text.SimpleDateFormat

SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd"); 
String formattedDate = formatter.format(date);

Bạn sẽ nhận được thêm thông tin ở đây văn bản liên kết

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.