Преобразование даты в формате "6 апреля 2012"

Я хочу получить день в "6-й 7-й.. и т.д. строки даты.

Я пробовал SimpleDateFormater, а также попробуйте с DateFormatSymbols. Я не получаю String Обязательно.

Есть ли способ обхода?

Ответ 1

SimpleDateFormat format = new SimpleDateFormat("d");
String date = format.format(new Date());

if(date.endsWith("1") && !date.endsWith("11"))
    format = new SimpleDateFormat("EE MMM d'st', yyyy");
else if(date.endsWith("2") && !date.endsWith("12"))
    format = new SimpleDateFormat("EE MMM d'nd', yyyy");
else if(date.endsWith("3") && !date.endsWith("13"))
    format = new SimpleDateFormat("EE MMM d'rd', yyyy");
else 
    format = new SimpleDateFormat("EE MMM d'th', yyyy");

String yourDate = format.format(new Date());

Попробуйте это, Это выглядит как статический, но отлично работает...

Ответ 2

Здесь вы идете:

/**
 * Converts Date object into string format as for e.g. <b>April 25th, 2012</b>
 * @param date date object
 * @return string format of provided date object
 */
public static String getCustomDateString(Date date){
    SimpleDateFormat tmp = new SimpleDateFormat("MMMM d");

    String str = tmp.format(date);
    str = str.substring(0, 1).toUpperCase() + str.substring(1);

    if(date.getDate()>10 && date.getDate()<14)
        str = str + "th, ";
    else{
        if(str.endsWith("1")) str = str + "st, ";
        else if(str.endsWith("2")) str = str + "nd, ";
        else if(str.endsWith("3")) str = str + "rd, ";
        else str = str + "th, ";
    }

    tmp = new SimpleDateFormat("yyyy");
    str = str + tmp.format(date);

    return str;
}

Пример

Log.i("myDate", getCustomDateString(new Date()));

25 апреля 2012 г.

Ответ 3

Вы можете подклассом SimpleDateFormat и переопределить формат и использовать простую функцию утилиты, которая принимает строку или целое число и возвращает строку с либо "nd", либо "st" прилагается... что-то вроде:

if (initialDate.equals("2") || initialDate.equals("22"){
    return initialDate += "nd";
}else if {initialDate.equals("3") || initialDate.equals("23"){
    return initialDate += "rd";
}else{
    return initialDate += "th";
}

Ответ 4

Следующий метод может использоваться для получения форматированной строки даты, которая ему передается. Он будет форматировать дату, чтобы сказать 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("MMMM d'st', yyyy").format(date);
        case 2:  
            return new SimpleDateFormat("MMMM d'nd', yyyy").format(date);
        case 3:  
            return new SimpleDateFormat("MMMM d'rd', yyyy").format(date);
        default: 
            return new SimpleDateFormat("MMMM d'th', yyyy").format(date);
    }

Ответ 5

Код ниже может быть полезен;

  SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
  Date date1 = format.parse("2018-06-06");
  String date = format.format(date1);

  if(date.endsWith("01") && !date.endsWith("11"))
    format = new SimpleDateFormat("d'st' MMM, yyyy");

  else if(date.endsWith("02") && !date.endsWith("12"))
    format = new SimpleDateFormat("d'nd' MMM, yyyy");

  else if(date.endsWith("03") && !date.endsWith("13"))
    format = new SimpleDateFormat("d'rd' MMM, yyyy");

  else
    format = new SimpleDateFormat("d'th' MMM, yyyy");

String yourDate = format.format(date1);

Вы получите 6 июня 2018 года.

Ответ 6

    public static String getDateText(String day){
      if(day.equalsIgnoreCase("1") || day.equalsIgnoreCase("21") || 
        day.equalsIgnoreCase("31")){
        return "st";
      }else if(day.equalsIgnoreCase("2") || day.equalsIgnoreCase("22")){
        return "nd";
      }else if(day.equalsIgnoreCase("3") || day.equalsIgnoreCase("23")){
        return "rd";
      }else {
        return "th";
      }
    }

Ответ 7

Для всех, кому нужна чистая статическая версия Kotlin с использованием SimpleDateFormat:

class Utils {

    companion object {
        private val dateFormat = SimpleDateFormat("MMM d, yyyy", Locale.getDefault())

       fun formatDate(date: Date): String {
            val oi = getOrdinalIndicator(date)
            return dateFormat.apply {
                applyPattern("MMM d'$oi', yyyy")
            }.format(date)
        }

        private fun getOrdinalIndicator(date: Date): String {
            val day = newCalendar(date).get(Calendar.DAY_OF_MONTH)

            if (day == 11 || day == 12 || day == 13) {
                return "th"
            }

            return when (day % 10) {
                1 -> "st"
                2 -> "nd"
                3 -> "rd"
                else -> "th"
            }
        }

        private fun newCalendar(date: Date): Calendar {
            return Calendar.getInstance().apply {
                time = date
            }
        }
    }
}

Ответ 8

Итак, вот рабочий код, написанный на kotlin.

         /**
         * Format the given date like Today, Tomorrow, Yesterday, 11th Nov, 2nd Dec etc.
         */
        fun getFormattedDay(context: Context, strFromDate: String, strFromDateFormat: String) : String
        {
            var formattedDay = ""
            val fromDateFormatter = SimpleDateFormat(strFromDateFormat, Locale.UK)
            val fromDate = fromDateFormatter.parse(strFromDate)

            val tty = getTTYDay(context, strFromDate, strFromDateFormat)
            if (!tty.isEmpty()) {
                return tty
            }

            val dayFormatter = Constants.SIMPLE_DATE_FORMAT_D
            val monthAndYearFormatter = Constants.SIMPLE_DATE_FORMAT_MMM_YYYY

            formattedDay = dayFormatter.format(fromDate)
            val dayOfMonth = formattedDay.toInt()

            if (dayOfMonth in 11..13) {
                formattedDay += "th, "
            }
            else {
                if (formattedDay.endsWith("1")) {
                    formattedDay += "st, "
                }
                else if (formattedDay.endsWith("2")) {
                    formattedDay += "nd, "
                }
                else if (formattedDay.endsWith("3")) {
                    formattedDay += "rd, "
                }
                else {
                    formattedDay += "th, "
                }
            }

            formattedDay += monthAndYearFormatter.format(fromDate)

            return formattedDay
        }

        /**
         * This method returns today, tomorrow or yesterday or else empty string.
         */
        fun getTTYDay(context: Context, strFromDate: String, strFromDateFormat: String) : String
        {
            val fromDateFormatter = SimpleDateFormat(strFromDateFormat, Locale.UK)
            return if (strFromDate == fromDateFormatter.format(Date())) {
                context.getString(R.string.today)
            }
            else if (strFromDate == fromDateFormatter.format(getYesterdayDate())) {
                context.getString(R.string.yesterday)
            }
            else if (strFromDate == fromDateFormatter.format(getTomorrowDate())) {
                context.getString(R.string.tomorrow)
            }
            else {
                ""
            }
        }

        fun getYesterdayDate(): Date {
            val cal = Calendar.getInstance()
            cal.add(Calendar.DATE, -1)
            return cal.time
        }

        fun getTomorrowDate(): Date {
            val cal = Calendar.getInstance()
            cal.add(Calendar.DATE, 1)
            return cal.time
        }

Этот метод также может быть вызван как статический. Как использовать?

Назовите этот метод как

getFormattedDay(context!!, "16/11/2018", "dd/MM/yyyy")

Вы получите результат как:

Сегодня, или завтра, или вчера, или 16-е, ноябрь 2018 года

Надеюсь, это поможет вам. Если вы не хотите сегодня, то завтра удалите вызов метода getTTYDay.

Различные типы используемых форматов даты:

        val DATE_FORMAT_DD_MM_YYYY_1 = "dd/MM/yyyy"
        val DATE_FORMAT_DD_MM_YYYY_2 = "dd MM yyyy"
        val DATE_FORMAT_DD_MMM_YYYY_1 = "dd MMM yyyy"
        val DATE_FORMAT_MMM_YYYY_1 = "MMM yyyy"
        val DATE_FORMAT_D_1 = "d"

        val SIMPLE_DATE_FORMAT_DD_MM_YYYY = SimpleDateFormat(DATE_FORMAT_DD_MM_YYYY_2, Locale.UK)
        val SIMPLE_DATE_FORMAT_DD_MMM_YYYY = SimpleDateFormat(DATE_FORMAT_DD_MMM_YYYY_1, Locale.UK)
        val SIMPLE_DATE_FORMAT_MMM_YYYY = SimpleDateFormat(DATE_FORMAT_MMM_YYYY_1, Locale.UK)
        val SIMPLE_DATE_FORMAT_D = SimpleDateFormat(DATE_FORMAT_D_1, Locale.UK)

Ответ 9

Версия Kotlin - обновленный код

     fun getFormattedDate(dateStr: String):String{
        try {
            var format = SimpleDateFormat("MM/dd/yyyy")//change your timeformat
            val date1 = format.parse(dateStr)
            var date = format.format(date1)

            if (date.startsWith("1") && !date.startsWith("11"))
                format = SimpleDateFormat("d'st' MMM, yyyy")
            else if (date.startsWith("2") && !date.startsWith("12"))
                format = SimpleDateFormat("d'nd' MMM, yyyy")
            else if (date.startsWith("3") && !date.startsWith("13"))
                format = SimpleDateFormat("d'rd' MMM, yyyy")
            else
                format = SimpleDateFormat("d'th' MMM, yyyy")

            val yourDate = format.format(date1)
            return yourDate
        }
        catch (ex: Exception){
            return dateStr
        }
    }