Làm thế nào để bạn định dạng ngày trong tháng để nói về 11 tháng 11, 19, 21, hay 23 tháng 11 (chỉ số thứ tự)?


146

Tôi biết điều này sẽ cho tôi những ngày tháng như một số ( 11, 21, 23):

SimpleDateFormat formatDayOfMonth = new SimpleDateFormat("d");

Nhưng làm thế nào để bạn định dạng ngày trong tháng để bao gồm một chỉ số thứ tự , nói 11th, 21sthoặc 23rd?


13
Để tham khảo, chúng được gọi là số thứ tự - en.wikipedia.org/wiki/Ordinal_number_(linguistic) .
ocodo

5
Chỉ cần cho hồ sơ, bất cứ điều gì xây dựng câu trả lời thay vì tìm kiếm toàn bộ câu trả lời trong một bảng gần như không thể bản địa hóa sang các ngôn ngữ khác.
Thorbjørn Ravn Andersen

2
Câu trả lời là bằng cách nào đó không chính xác có một cái nhìn vào câu trả lời của tôi plz.
J888

2
Nhận xét hiện đại: Tôi khuyên bạn nên tránh SimpleDateFormatlớp học. Nó không chỉ lỗi thời lâu dài, mà còn nổi tiếng là rắc rối. Ngày nay chúng ta có rất nhiều thứ tốt hơn java.time, API ngày và thời gian Java hiện đại và của nó DateTimeFormatter.
Ole VV

Hãy xem API số ( math.tools/api/numbers ). Nó có hỗ trợ cho thứ tự, hồng y, số được đánh vần bằng các ngôn ngữ khác nhau, được đánh vần là tiền tệ trong các ngôn ngữ khác nhau, v.v.
dors

Câu trả lời:


181
// https://github.com/google/guava
import static com.google.common.base.Preconditions.*;

String getDayOfMonthSuffix(final int n) {
    checkArgument(n >= 1 && n <= 31, "illegal day of month: " + n);
    if (n >= 11 && n <= 13) {
        return "th";
    }
    switch (n % 10) {
        case 1:  return "st";
        case 2:  return "nd";
        case 3:  return "rd";
        default: return "th";
    }
}

Bảng từ @kaliatech là tốt, nhưng vì cùng một thông tin được lặp lại, nó mở ra cơ hội cho một lỗi. Một lỗi như vậy thực sự tồn tại trong bảng cho 7tn, 17tn27tn(lỗi này có thể bị cố định như thời gian đi về vì bản chất chất lỏng của StackOverflow, vì vậy kiểm tra lịch sử phiên bản trên câu trả lời để xem lỗi).


36
nó thực sự cảm thấy như một sự giám sát trong định dạng dữ liệu đơn giản, phải không?
stevevls

51
Hãy vui vẻ quốc tế hóa điều này. : D
Trejkaz

6
@Trejkaz Ngoài phạm vi câu hỏi :)
Greg Mattes

3
Giải pháp này chỉ hỗ trợ tiếng Anh. Sử dụng RuleBasingNumberFormat từ ICU4J cho giải pháp được bản địa hóa.
Tôi không biết gì về

7
Các bạn đang tắt cỏ dại, và giai điệu đang thay đổi một chút. Không cần điều đó. Câu hỏi này không hỏi về sự phức tạp của quốc tế hóa. Quốc tế hóa chắc chắn là một chủ đề tốt để thảo luận, nhưng nó nên được thực hiện trên một câu hỏi khác với trọng tâm đó. Tôi đã luôn giải thích câu hỏi này là yêu cầu một cách nhanh chóng và bẩn thỉu để thực hiện điều này bằng tiếng Anh. Vì vậy, tôi đề nghị rằng nếu thực sự không có giải pháp tốt nào trong thế giới Java thân thiện với quốc tế hóa thì chúng ta sẽ bắt đầu một dự án, ví dụ như GitHub và tạo ra một giải pháp tốt. Hãy cho tôi biết nếu bạn quan tâm.
Greg Mattes

51

Không có gì trong JDK để làm điều này.

  static String[] suffixes =
  //    0     1     2     3     4     5     6     7     8     9
     { "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th",
  //    10    11    12    13    14    15    16    17    18    19
       "th", "th", "th", "th", "th", "th", "th", "th", "th", "th",
  //    20    21    22    23    24    25    26    27    28    29
       "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th",
  //    30    31
       "th", "st" };

 Date date = new Date();
 SimpleDateFormat formatDayOfMonth  = new SimpleDateFormat("d");
 int day = Integer.parseInt(formatDateOfMonth.format(date));
 String dayStr = day + suffixes[day];

Hoặc sử dụng Lịch:

 Calendar c = Calendar.getInstance();
 c.setTime(date);
 int day = c.get(Calendar.DAY_OF_MONTH);
 String dayStr = day + suffixes[day];

Theo nhận xét của @ thorbjørn-ravn-andersen, một bảng như thế này có thể hữu ích khi bản địa hóa:

  static String[] suffixes =
     {  "0th",  "1st",  "2nd",  "3rd",  "4th",  "5th",  "6th",  "7th",  "8th",  "9th",
       "10th", "11th", "12th", "13th", "14th", "15th", "16th", "17th", "18th", "19th",
       "20th", "21st", "22nd", "23rd", "24th", "25th", "26th", "27th", "28th", "29th",
       "30th", "31st" };

8
Nếu bạn để bảng chứa đầy đủ "21", "23", "29", nó có thể được ngoại hóa và bản địa hóa sang các ngôn ngữ khác. Đối với phần mềm thành công có thể trở thành một yêu cầu.
Thorbjørn Ravn Andersen

40
private String getCurrentDateInSpecificFormat(Calendar currentCalDate) {
    String dayNumberSuffix = getDayNumberSuffix(currentCalDate.get(Calendar.DAY_OF_MONTH));
    DateFormat dateFormat = new SimpleDateFormat(" d'" + dayNumberSuffix + "' MMMM yyyy");
    return dateFormat.format(currentCalDate.getTime());
}

private String getDayNumberSuffix(int day) {
    if (day >= 11 && day <= 13) {
        return "th";
    }
    switch (day % 10) {
    case 1:
        return "st";
    case 2:
        return "nd";
    case 3:
        return "rd";
    default:
        return "th";
    }
}

Tôi vừa thử giải pháp của bạn trong khi bỏ qua các dấu ngoặc đơn trong chuỗi mẫu được cung cấp cho hàm tạo SimpleDateFormat. Bây giờ tôi thấy tại sao họ ở đó. Tôi nhận được một java.lang.IllegalArgumentExceptionvì "một nhân vật mẫu bất hợp pháp, t."
danny điển hình

17

Câu hỏi ít cũ. Vì câu hỏi này rất ồn ào, vì vậy việc đăng những gì tôi đã giải quyết bằng phương thức tĩnh là một tiện ích. Chỉ cần sao chép, dán và sử dụng nó!

 public static String getFormattedDate(Date date){
            Calendar cal=Calendar.getInstance();
            cal.setTime(date);
            //2nd of march 2015
            int day=cal.get(Calendar.DATE);

            if(!((day>10) && (day<19)))
            switch (day % 10) {
            case 1:  
                return new SimpleDateFormat("d'st' 'of' MMMM yyyy").format(date);
            case 2:  
                return new SimpleDateFormat("d'nd' 'of' MMMM yyyy").format(date);
            case 3:  
                return new SimpleDateFormat("d'rd' 'of' MMMM yyyy").format(date);
            default: 
                return new SimpleDateFormat("d'th' 'of' MMMM yyyy").format(date);
        }
        return new SimpleDateFormat("d'th' 'of' MMMM yyyy").format(date);
    }

Để thử nghiệm purose

Ví dụ: gọi nó từ phương thức chính!

Date date = new Date();
        Calendar cal=Calendar.getInstance();
        cal.setTime(date);
        for(int i=0;i<32;i++){
          System.out.println(getFormattedDate(cal.getTime()));
          cal.set(Calendar.DATE,(cal.getTime().getDate()+1));
        }

Đầu ra:

22nd of February 2018
23rd of February 2018
24th of February 2018
25th of February 2018
26th of February 2018
27th of February 2018
28th of February 2018
1st of March 2018
2nd of March 2018
3rd of March 2018
4th of March 2018
5th of March 2018
6th of March 2018
7th of March 2018
8th of March 2018
9th of March 2018
10th of March 2018
11th of March 2018
12th of March 2018
13th of March 2018
14th of March 2018
15th of March 2018
16th of March 2018
17th of March 2018
18th of March 2018
19th of March 2018
20th of March 2018
21st of March 2018
22nd of March 2018
23rd of March 2018
24th of March 2018
25th of March 2018

16
String ordinal(int num)
{
    String[] suffix = {"th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th"};
    int m = num % 100;
    return String.valueOf(num) + suffix[(m > 3 && m < 21) ? 0 : (m % 10)];
}

14

Tôi muốn đóng góp câu trả lời hiện đại. Các SimpleDateFormatlớp học đã được OK để sử dụng khi câu hỏi được hỏi 8 năm trước, nhưng bạn nên tránh nó bây giờ vì nó không chỉ dài lỗi thời, mà còn nổi tiếng là phiền hà. Sử dụng java.timethay thế.

Biên tập

DateTimeFormatterBuilder.appendText(TemporalField, Map<Long, String>)là tuyệt vời cho mục đích này. Sử dụng nó, chúng tôi xây dựng một trình định dạng thực hiện công việc cho chúng tôi:

    Map<Long, String> ordinalNumbers = new HashMap<>(42);
    ordinalNumbers.put(1L, "1st");
    ordinalNumbers.put(2L, "2nd");
    ordinalNumbers.put(3L, "3rd");
    ordinalNumbers.put(21L, "21st");
    ordinalNumbers.put(22L, "22nd");
    ordinalNumbers.put(23L, "23rd");
    ordinalNumbers.put(31L, "31st");
    for (long d = 1; d <= 31; d++) {
        ordinalNumbers.putIfAbsent(d, "" + d + "th");
    }

    DateTimeFormatter dayOfMonthFormatter = new DateTimeFormatterBuilder()
            .appendText(ChronoField.DAY_OF_MONTH, ordinalNumbers)
            .appendPattern(" MMMM")
            .toFormatter();

    LocalDate date = LocalDate.of(2018, Month.AUGUST, 30);
    for (int i = 0; i < 6; i++) {
        System.out.println(date.format(dayOfMonthFormatter));
        date = date.plusDays(1);
    }

Đầu ra từ đoạn trích này là:

30th August
31st August
1st September
2nd September
3rd September
4th September

Câu trả lời cũ

Mã này ngắn hơn, nhưng IMHO không quá thanh lịch.

    // ordinal indicators by numbers (1-based, cell 0 is wasted)
    String[] ordinalIndicators = new String[31 + 1];
    Arrays.fill(ordinalIndicators, 1, ordinalIndicators.length, "th");
    ordinalIndicators[1] = ordinalIndicators[21] = ordinalIndicators[31] = "st";
    ordinalIndicators[2] = ordinalIndicators[22] = "nd";
    ordinalIndicators[3] = ordinalIndicators[23] = "rd";

    DateTimeFormatter dayOfMonthFormatter = DateTimeFormatter.ofPattern("d");

    LocalDate today = LocalDate.now(ZoneId.of("America/Menominee")).plusWeeks(1);
    System.out.println(today.format(dayOfMonthFormatter) 
                        + ordinalIndicators[today.getDayOfMonth()]);

Chạy đoạn trích này ngay bây giờ tôi đã nhận

Ngày 23

Một trong nhiều tính năng của java.timenó là đơn giản và đáng tin cậy để có được ngày trong tháng như mộtint điều rõ ràng là cần thiết để chọn hậu tố đúng từ bảng.

Tôi khuyên bạn nên viết một bài kiểm tra đơn vị quá.

PS Một định dạng tương tự cũng có thể được sử dụng để phân tích một chuỗi ngày có chứa số thứ tự như 1st, 2ndvv Đó đã được thực hiện trong câu hỏi này: Java - ngày Parse với giây tùy chọn .

Liên kết: Hướng dẫn của Oracle: Ngày Thời gian giải thích cách sử dụng java.time.


Rất thích nhận được câu trả lời này được nâng lên cao hơn vì câu trả lời hiện đại hơn này tốt hơn là cố gắng thực hiện triển khai của riêng bạn.
Kreas

9

Nếu bạn cố gắng nhận thức được i18n, giải pháp thậm chí còn phức tạp hơn.

Vấn đề là trong các ngôn ngữ khác, hậu tố có thể không chỉ phụ thuộc vào số lượng mà còn phụ thuộc vào danh từ mà nó tính. Ví dụ, trong tiếng Nga, nó sẽ là "2-ой ен ен ен ен ен е е е е е е е е е е е е е е е е е Điều này không áp dụng nếu chúng ta chỉ định dạng ngày, nhưng trong trường hợp chung chung hơn một chút, bạn nên nhận thức được sự phức tạp.

Tôi nghĩ giải pháp tốt (tôi không có thời gian để thực hiện) sẽ mở rộng SimpleDateFormetter để áp dụng MessageFormat nhận biết Locale trước khi chuyển sang lớp cha. Bằng cách này, bạn sẽ có thể hỗ trợ giả sử cho các định dạng tháng 3% M để có được "3 -rd",% MM để có được "03 -rd" và% MMM để có được "thứ ba". Từ bên ngoài lớp này trông giống như SimpleDateFormatter thông thường, nhưng hỗ trợ nhiều định dạng hơn. Ngoài ra, nếu mẫu này do nhầm lẫn được áp dụng bởi SimpleDateFormetter thông thường, kết quả sẽ được định dạng không chính xác, nhưng vẫn có thể đọc được.


Điểm hay về giới tính trong tiếng Nga, nhưng về mặt kỹ thuật sẽ khiến% MMM không thể thực hiện được nếu không có bối cảnh bổ sung.
Nhà vật lý điên

@Mad Physicist, điều này không đúng vì% MMM sẽ được áp dụng cho tháng, vì vậy chúng tôi biết danh từ để chia động từ.
CAB

6

Nhiều ví dụ ở đây sẽ không hoạt động cho 11, 12, 13. Điều này chung chung hơn và sẽ hoạt động cho mọi trường hợp.

switch (date) {
                case 1:
                case 21:
                case 31:
                    return "" + date + "st";

                case 2:
                case 22:
                    return "" + date + "nd";

                case 3:
                case 23:
                    return "" + date + "rd";

                default:
                    return "" + date + "th";
}

5

Tôi không thể hài lòng với câu trả lời yêu cầu giải pháp chỉ có tiếng Anh dựa trên các định dạng thủ công. Tôi đã tìm kiếm một giải pháp thích hợp trong một thời gian và cuối cùng tôi đã tìm thấy nó.

Bạn nên sử dụng RuleBasingNumberFormat . Nó hoạt động hoàn hảo và nó tôn trọng Địa phương.


3

Có một cách đơn giản và chắc chắn hơn để làm điều này. Hàm bạn sẽ cần sử dụng là getDateFromDateString (dateString); Về cơ bản, nó loại bỏ st / nd / rd / th của chuỗi ngày và chỉ cần phân tích cú pháp. Bạn có thể thay đổi SimpleDateFormat của bạn thành bất cứ điều gì và điều này sẽ hoạt động.

public static final SimpleDateFormat sdf = new SimpleDateFormat("d");
public static final Pattern p = Pattern.compile("([0-9]+)(st|nd|rd|th)");

private static Date getDateFromDateString(String dateString) throws ParseException {
     return sdf.parse(deleteOrdinal(dateString));
}

private static String deleteOrdinal(String dateString) {
    Matcher m = p.matcher(dateString);
    while (m.find()) {
        dateString = dateString.replaceAll(Matcher.quoteReplacement(m.group(0)), m.group(1));
    }
    return dateString;

}


1
Câu trả lời này là về phân tích chuỗi trong khi Câu hỏi là về việc tạo Chuỗi. Nhưng vẫn thích hợp vì người ta có thể cần cả hai hướng. Ngoài ra, câu trả lời này giải quyết câu hỏi khác này .
Basil Bourque

3

Chỉ có vấn đề với giải pháp do Greg cung cấp là nó không chiếm số lớn hơn 100 với số "tuổi teen" kết thúc. Ví dụ: 111 phải là 111, không phải 111. Đây là giải pháp của tôi:

/**
 * Return ordinal suffix (e.g. 'st', 'nd', 'rd', or 'th') for a given number
 * 
 * @param value
 *           a number
 * @return Ordinal suffix for the given number
 */
public static String getOrdinalSuffix( int value )
{
    int hunRem = value % 100;
    int tenRem = value % 10;

    if ( hunRem - tenRem == 10 )
    {
        return "th";
    }
    switch ( tenRem )
    {
    case 1:
        return "st";
    case 2:
        return "nd";
    case 3:
        return "rd";
    default:
        return "th";
    }
}

6
Trong trường hợp nào một chuỗi ngày tháng có nhiều hơn 31 ngày ??
SatanEnglish

@SatanEnglish, điểm hay của phương pháp nhà máy tĩnh này là nó có thể được sử dụng nhiều hơn là chỉ nhận được hậu tố của một tháng. :)
Jared Rummler

1
Phương thức này trả về st cho 11, nd cho 12 và thứ 13 cho 13
TheIT

@SatanEnglish. Cho rằng hôm nay là ngày thứ 137 trong lịch lựa chọn của tôi, tôi nghĩ rằng câu hỏi của bạn tự trả lời. Nghiêm túc mà nói, lịch phi Gregorian rất nhiều nếu bạn biết nơi để tìm.
Nhà vật lý điên

Không, @ TheIT, không. Tôi đã thử nghiệm. Nó trả về th11, 12 và 13 như bình thường. Tôi tin rằng if ( hunRem - tenRem == 10 )trường hợp chắc chắn rằng nó làm.
Ole VV

2

RuleBasedNumberFormat trong thư viện ICU

Tôi đánh giá cao liên kết đến thư viện của dự án ICU từ @ Pierre-Olivier Dybman ( http://www.icu-project.org/apiref/icu4j/com/ibm/icu/text/RuleBasingNumberFormat.html ), tuy nhiên vẫn phải tìm Làm thế nào để sử dụng nó, vì vậy một ví dụ về việc RuleBasedNumberFormatsử dụng là dưới đây.

Nó sẽ chỉ định dạng một số chứ không phải toàn bộ ngày, vì vậy bạn sẽ cần xây dựng một chuỗi kết hợp nếu tìm kiếm một ngày ở định dạng: ví dụ: Thứ Hai ngày 3 tháng 2.

Đoạn mã dưới đây thiết lập RuleBasedNumberFormatđịnh dạng Ordinal cho một Locale nhất định, tạo một java.time ZonedDateTimevà sau đó định dạng số với thứ tự của nó thành một chuỗi.

RuleBasedNumberFormat numOrdinalFormat = new RuleBasedNumberFormat(Locale.UK,
    RuleBasedNumberFormat.ORDINAL);
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Pacific/Auckland"));

String dayNumAndOrdinal = numOrdinalFormat.format(zdt.toLocalDate().getDayOfMonth());

Ví dụ đầu ra:

lần thứ 3

Hoặc là

lần thứ 4

Vân vân.


1

Dưới đây là một cách tiếp cận cập nhật mẫu DateTimeFormatter với nghĩa đen hậu tố chính xác nếu nó tìm thấy mẫu đó d'00', ví dụ cho ngày 1 tháng, nó sẽ được thay thế bằng d'st'. Khi mẫu đã được cập nhật, nó có thể được đưa vào DateTimeFormatter để làm phần còn lại.

private static String[] suffixes = {"th", "st", "nd", "rd"};

private static String updatePatternWithDayOfMonthSuffix(TemporalAccessor temporal, String pattern) {
    String newPattern = pattern;
    // Check for pattern `d'00'`.
    if (pattern.matches(".*[d]'00'.*")) {
        int dayOfMonth = temporal.get(ChronoField.DAY_OF_MONTH);
        int relevantDigits = dayOfMonth < 30 ? dayOfMonth % 20 : dayOfMonth % 30;
        String suffix = suffixes[relevantDigits <= 3 ? relevantDigits : 0];
        newPattern = pattern.replaceAll("[d]'00'", "d'" + suffix + "'");
    }

    return newPattern;
}

Nó yêu cầu mẫu ban đầu được cập nhật ngay trước mỗi cuộc gọi định dạng, ví dụ:

public static String format(TemporalAccessor temporal, String pattern) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(updatePatternWithDayOfMonthSuffix(temporal, pattern));
    return formatter.format(temporal);
}

Vì vậy, điều này hữu ích nếu mẫu định dạng được xác định bên ngoài mã Java, ví dụ: mẫu, trong đó nếu bạn có thể xác định mẫu trong Java thì câu trả lời của @ OleV.V. có thể phù hợp hơn


1
Sáng tạo và hấp dẫn. Tôi chắc chắn phải mất một thời gian dài để hiểu cách thức hoạt động của nó. Đó không phải là một dấu hiệu của mã tốt.
Ole VV

1
@ OleV.V. thx cho phản hồi - Tôi đã cấu trúc lại nó một chút để nó ít dài dòng hơn một chút. Chỉ cần nhìn thấy cách tiếp cận của bạn và tôi thích nó! Tôi nghĩ cả hai cách tiếp cận đều hợp lệ với sự đánh đổi khác nhau. Bạn không yêu cầu bất kỳ sự hỗ trợ nào nữa tại điểm định dạng nhưng không yêu cầu mẫu được xác định bằng cách sử dụng trình xây dựng loại trừ định nghĩa mẫu trong mã không phải Java. Cách tiếp cận của tôi không yêu cầu hỗ trợ bổ sung tại điểm định dạng nhưng không phụ thuộc vào trình tạo để tạo mẫu để làm cho nó linh hoạt hơn một chút trong đó mẫu có thể được xác định. Yêu cầu của tôi chỉ ra điều thứ hai
tazmaniax

3
Tài khoản rất tốt về ưu và nhược điểm. Bạn có thể muốn bao gồm nó trong câu trả lời? Chỉ là một ý tưởng.
Ole VV

1

Tôi đã tự viết cho mình một phương pháp trợ giúp để có được các mẫu cho việc này.

public static String getPattern(int month) {
    String first = "MMMM dd";
    String last = ", yyyy";
    String pos = (month == 1 || month == 21 || month == 31) ? "'st'" : (month == 2 || month == 22) ? "'nd'" : (month == 3 || month == 23) ? "'rd'" : "'th'";
    return first + pos + last;
}

và sau đó chúng ta có thể gọi nó là

LocalDate localDate = LocalDate.now();//For reference
int month = localDate.getDayOfMonth();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(getPattern(month));
String date = localDate.format(formatter);
System.out.println(date);

đầu ra là

December 12th, 2018

Điều này đòi hỏi API tối thiểu là 26 mặc dù :)
Mikkel Larsen

@MikkelLarsen câu hỏi này không phải về Android, tôi đã sử dụng Java 8 cho việc này. Android không hỗ trợ api lớn cho java 8.
SamHoque

@SamSakerz xấu của tôi :)
Mikkel Larsen

@MikkelLarsen Hầu hết chức năng java.time được chuyển ngược lại sang Java 6 & Java 7 trong dự án ThreeTen-Backport . Thích nghi hơn nữa cho Android trước đó (<26) trong ThreeTenABP . Xem Cách sử dụng ThreeTenABP .
Basil Bourque

1

Hãy thử chức năng dưới đây:

public static String getFormattedDate(Date date) 
{
  Calendar cal = Calendar.getInstance();
  cal.setTime(date);
  //2nd of march 2015
  int day = cal.get(Calendar.DATE);
  if (!((day > 10) && (day < 19)))
   switch (day % 10) {
    case 1:
     return new SimpleDateFormat("d'st' 'of' MMMM yyyy").format(date);
    case 2:
     return new SimpleDateFormat("d'nd' 'of' MMMM yyyy").format(date);
    case 3:
     return new SimpleDateFormat("d'rd' 'of' MMMM yyyy").format(date);
    default:
     return new SimpleDateFormat("d'th' 'of' MMMM yyyy").format(date);
   }
  return new SimpleDateFormat("d'th' 'of' MMMM yyyy").format(date);
}

Khi trả lời một câu hỏi cũ, câu trả lời của bạn sẽ hữu ích hơn nhiều cho những người dùng StackOverflow khác nếu bạn đưa vào một số ngữ cảnh để giải thích cách trả lời của bạn, đặc biệt đối với một câu hỏi đã có câu trả lời được chấp nhận. Xem: Làm thế nào để tôi viết một câu trả lời tốt .
David Buck

Cảm ơn vì muốn đóng góp. Tôi khuyên chúng ta không nên sử dụng Date, CalendarSimpleDateFormat. Những lớp học đó được thiết kế kém và lỗi thời, cuối cùng đặc biệt là rắc rối. Thay vì sử dụng LocalDateDateTimeFormatter, cả từ java.time, API ngày và giờ Java hiện đại . Ngoài ra tôi nghi ngờ câu trả lời mới của bạn đóng góp gì so với 18 câu trả lời khác?
Ole VV

0

Trong kotlin bạn có thể sử dụng như thế này

fun changeDateFormats(currentFormat: String, dateString: String): String {
        var result = ""
        try {
            val formatterOld = SimpleDateFormat(currentFormat, Locale.getDefault())
            formatterOld.timeZone = TimeZone.getTimeZone("UTC")

            var date: Date? = null

            date = formatterOld.parse(dateString)

            val dayFormate = SimpleDateFormat("d", Locale.getDefault())
            var day = dayFormate.format(date)

            val formatterNew = SimpleDateFormat("hh:mm a, d'" + getDayOfMonthSuffix(day.toInt()) + "' MMM yy", Locale.getDefault())

            if (date != null) {
                result = formatterNew.format(date)
            }

        } catch (e: ParseException) {
            e.printStackTrace()
            return dateString
        }

        return result
    }


    private fun getDayOfMonthSuffix(n: Int): String {
        if (n in 11..13) {
            return "th"
        }
        when (n % 10) {
            1 -> return "st"
            2 -> return "nd"
            3 -> return "rd"
            else -> return "th"
        }
    }

đặt như thế này

  txt_chat_time_me.text = changeDateFormats("SERVER_DATE", "DATE")

-3

Phương pháp sau đây có thể được sử dụng để lấy chuỗi được định dạng của ngày được truyền vào nó. Nó sẽ định dạng ngày để nói 1, 2, 3, 4 .. bằng cách sử dụng SimpleDateFormat trong Java. ví dụ: - ngày 1 tháng 9 năm 2015

public String getFormattedDate(Date date){
            Calendar cal=Calendar.getInstance();
            cal.setTime(date);
            //2nd of march 2015
            int day=cal.get(Calendar.DATE);

            switch (day % 10) {
            case 1:  
                return new SimpleDateFormat("d'st' 'of' MMMM yyyy").format(date);
            case 2:  
                return new SimpleDateFormat("d'nd' 'of' MMMM yyyy").format(date);
            case 3:  
                return new SimpleDateFormat("d'rd' 'of' MMMM yyyy").format(date);
            default: 
                return new SimpleDateFormat("d'th' 'of' MMMM yyyy").format(date);
        }

-4

Sau đây là một câu trả lời hiệu quả hơn cho câu hỏi thay vì mã hóa phong cách.

Để thay đổi ngày thành số thứ tự, bạn cần sử dụng hậu tố sau .

DD +     TH = DDTH  result >>>> 4TH

OR to spell the number add SP to the format

DD + SPTH = DDSPTH   result >>> FOURTH

Tìm câu trả lời hoàn thành của tôi trong câu hỏi này .


Câu hỏi là để định dạng trong Java không trong cơ sở dữ liệu Oracle docs.oracle.com/cd/B12037_01/server.101/b10759/... Java SimpleDateFormat sử dụng đối với ngày: docs.oracle.com/javase/tutorial/i18n/format/...
Belal mazlom

-9
public String getDaySuffix(int inDay)
{
  String s = String.valueOf(inDay);

  if (s.endsWith("1"))
  {
    return "st";
  }
  else if (s.endsWith("2"))
  {
    return "nd";
  }
  else if (s.endsWith("3"))
  {
    return "rd";
  }
  else
  {
    return "th";
  }
}

Nó không nên sử dụng endWith (); sản xuất sai sản lượng
Rahul Sharma
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.