Как вы форматируете день месяца, чтобы сказать «11-й», «21-й» или «23-й» (порядковый индикатор)? - PullRequest
126 голосов
/ 25 октября 2010

Я знаю, что это даст мне день месяца в виде числа (11, 21, 23):

SimpleDateFormat formatDayOfMonth = new SimpleDateFormat("d");

Но как вы форматируете день месяцавключить порядковый указатель , скажем 11th, 21st или 23rd?

Ответы [ 18 ]

2 голосов
/ 27 февраля 2013

Единственная проблема с решением, предоставленным Грегом, состоит в том, что он не учитывает число больше 100 с окончанием «подростковых» номеров.Например, 111 должен быть 111-м, а не 111-м.Это мое решение:

/**
 * 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";
    }
}
1 голос
/ 12 декабря 2018

Я написал себе вспомогательный метод для получения шаблонов для этого.

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

и тогда мы можем назвать его как

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

вывод

December 12th, 2018
1 голос
/ 08 ноября 2018

Вот подход, который обновляет шаблон DateTimeFormatter с правильным суффиксным литералом, если он находит шаблон d'00', например, для дня месяца 1 он будет заменен на d'st'.После того, как шаблон был обновлен, его можно просто передать в DateTimeFormatter, чтобы сделать все остальное.

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

Требуется, чтобы исходный шаблон обновлялся непосредственно перед каждым вызовом форматирования, например,

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

Так что это полезно, если шаблон форматирования определяется вне кода Java,например, шаблон, где, как будто вы можете определить шаблон в Java, тогда ответ @ OleV.V.может быть более подходящим

0 голосов
/ 20 марта 2018

Если вам нужно это на Android, вы можете проверить этот ответ

Это интернационализированное решение.И вам не нужно изобретать велосипед;)

0 голосов
/ 13 февраля 2018

В котлине вы можете использовать вот так

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"
        }
    }

установить как это

  txt_chat_time_me.text = changeDateFormats("SERVER_DATE", "DATE")
0 голосов
/ 14 января 2013
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";
  }
}
0 голосов
/ 02 сентября 2015

Следующий метод может использоваться для получения отформатированной строки даты, которая передана ей.Он отформатирует дату, скажем 1-й, 2-й, 3-й, 4-й .. используя SimpleDateFormat в Java.например: - 1 сентября 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);
        }
0 голосов
/ 31 июля 2013

Ниже приведен более эффективный ответ на вопрос, нежели жесткое кодирование стиля.

Чтобы изменить день на порядковый номер, необходимо использовать следующий суффикс .

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

OR to spell the number add SP to the format

DD + SPTH = DDSPTH   result >>> FOURTH

Найдите мой полный ответ в этом вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...