Ayın gününü “11.”, “21.” veya “23.” (sıralı gösterge) diyecek şekilde nasıl biçimlendirirsiniz?


146

Bunun bir sayı olarak bana ayın gününü verecektir biliyorum ( 11, 21, 23):

SimpleDateFormat formatDayOfMonth = new SimpleDateFormat("d");

Ama nasıl bir içerecek şekilde ayın gününü biçimlendiririm sıra göstergesi , diyelim 11th, 21stya 23rd?


13
Referans olarak bunlara sıra sayıları denir - en.wikipedia.org/wiki/Ordinal_number_(linguistics) .
ocodo

5
Sadece kayıt için, tüm cevabı bir tabloya bakmak yerine yanıtı oluşturan herhangi bir şey , diğer dillere yerelleştirmek imkansızdır.
Thorbjørn Ravn Andersen

2
Cevap bir şekilde yanlış benim cevap plz bir göz var.
J888

2
Modern yorum: Sınıftan kaçınmanızı öneririm SimpleDateFormat. Sadece çok eski değil, aynı zamanda kötü şöhretli. Bugün java.timemodern Java tarih ve saat API ve onun çok daha iyi var DateTimeFormatter.
Ole VV

Sayı API'sına bir göz atın ( math.tools/api/numbers ). Farklı dillerde
sıralanan

Yanıtlar:


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

@Kaliatech'teki tablo güzel, ama aynı bilgiler tekrarlandığından, bir hata şansı sunuyor. Böyle bir hata aslında Tabloda var 7tn, 17tnve 27tn(zaman öylesine kontrol çünkü StackOverflow akışkan doğasının geçtikçe bu hata düzeltildi olsun belki Yanıta sürüm geçmişi hatasını görmek için).


36
gerçekten basit veri biçiminde bir gözetim gibi geliyor, değil mi?
stevevls

51
Bunu uluslararası hale getirirken eğlenin. : D
Trejkaz

6
@Trejkaz Sorunun kapsamı dışında :)
Greg Mattes

3
Bu çözüm yalnızca İngilizce'yi desteklemektedir. Yerelleştirilmiş çözüm için ICU4J'den RuleBasedNumberFormat kullanın.
Дмитро Яковлєв

7
Sizler yabani otların arasındasınız ve ton biraz değişiyor. Buna gerek yok. Bu soru uluslararasılaşmanın inceliklerini sormadı. Uluslararasılaşma kesinlikle tartışılması gereken iyi bir konudur, ancak bu odağa sahip başka bir soru üzerinde yapılmalıdır. Bu soruyu her zaman İngilizce'de bunu başarmanın hızlı ve kirli bir yolunu istemek için yorumladım. Dolayısıyla, Java dünyasında uluslararasılaşma dostu olan gerçekten iyi bir çözüm yoksa, örneğin GitHub üzerine bir proje başlatmamızı ve iyi bir çözüm oluşturmamızı öneririm. İlgileniyorsanız bana bildirin.
Greg Mattes

51

JDK'da bunu yapacak hiçbir şey yok.

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

Veya Takvim'i kullanarak:

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

@ Thorbjørn-ravn-andersen tarafından yapılan yorumlara göre, böyle bir tablo yerelleştirirken yardımcı olabilir:

  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
Tablonun "21", "23", "29" un tamamını içermesine izin verirseniz, harici ve diğer dillere yerelleştirilebilir. Başarılı bir yazılım için bir gereklilik haline gelebilir.
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";
    }
}

SimpleDateFormat yapıcısına sağlanan desen dizesindeki tek tırnakları atlarken çözümünüzü denedim. Şimdi neden orada olduklarını anlıyorum. java.lang.IllegalArgumentException"Yasadışı bir desen karakteri, t" yüzünden alıyorum .
tipik danny

17

Soru biraz eski. Bu soru çok gürültülü olduğu için bu yüzden bir util olarak statik yöntemle çözdüm ne gönderme. Sadece kopyalayın, yapıştırın ve kullanı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);
    }

Purose testi için

Örnek: ana yöntemden çağırmak!

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

Çıktı:

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

15

Modern cevaba katkıda bulunmak istiyorum. SimpleDateFormatSınıf soru 8 yıl önce istendi kullanımına Tamam oldu, ama bunu sadece uzun modası geçmiş değil şimdi bunu önlemek değil, aynı zamanda herkesin bildiği zahmetli olmalıdır. java.timeBunun yerine kullanın .

Düzenle

DateTimeFormatterBuilder.appendText(TemporalField, Map<Long, String>)bu amaç için harika. Bunu kullanarak bizim için işe yarayan bir formatlayıcı oluşturuyoruz:

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

Bu snippet'in çıktısı:

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

Eski cevap

Bu kod daha kısa, ancak IMHO çok zarif değil.

    // 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()]);

Bu pasajı şimdi çalıştırıyorum

23

Birçok özelliğinden biri java.time, ayın gününü bir inttablo olarak almanın açık ve güvenilir olması , ki bu da tablodan doğru soneki seçmek için gerekli.

Ben de bir birim testi yazmanızı tavsiye ederim.

PS Benzer bir biçimlendirici da kullanılabilir ayrıştırma bir benzeri sıra numaralarını içeren tarih dizesi 1st, 2ndyapıldığını, vb : Bu soru opsiyonel saniye ile ayrıştırma tarih - Java .

Bağlantı: Oracle eğitimi: Tarih Saati nasıl kullanılacağını açıklar java.time.


Bu daha modern cevap kendi uygulamanızı yuvarlamaya çalışmaktan daha iyi olduğu için bu cevabı daha yükseğe çıkarmayı çok isterim.
Krease

9

Eğer i18n'nin farkında olmaya çalışırsanız çözüm daha da karmaşıklaşır.

Sorun şu ki, diğer dillerde sonek sadece sayının kendisine değil, aynı zamanda saydığı isme de bağlı olabilir. Örneğin Rusça'da "2-ой день", ancak "2-ая неделя" (bunlar "2. gün", ancak "2. hafta" anlamına gelir) olacaktır. Yalnızca günleri biçimlendirirsek bu geçerli değildir, ancak biraz daha genel bir durumda karmaşıklığın farkında olmalısınız.

Ben güzel bir çözüm (aslında uygulamak için zaman yoktu) üst sınıfa geçmeden Locale duyarlı MessageFormat uygulamak için SimpleDateFormetter uzatmak olacağını düşünüyorum. Bu şekilde Mart biçimlerinin% M için "3-rd",% MM için "03-rd" ve% MMM için "üçüncü" olsun diyelim. Dışarıdan bu sınıf normal SimpleDateFormatter gibi görünüyor, ancak daha fazla formatı destekliyor. Ayrıca, bu desen yanlışlıkla normal SimpleDateFormetter tarafından uygulanacaksa, sonuç yanlış biçimlendirilir, ancak yine de okunabilir olur.


Rusça cinsiyetler hakkında iyi bir nokta, ancak bu teknik olarak% MMM'yi ek bağlam olmadan imkansız hale getirecektir.
Mad Physicist

@Mad Physicist, bu ay için% MMM uygulanacağı için doğru değil, bu yüzden konjuge edilecek ismi biliyoruz.
CAB

6

Buradaki örneklerin çoğu 11, 12, 13 için çalışmaz. Bu daha geneldir ve tüm durumlar için işe yarar.

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


3

Bunu yapmanın daha basit ve kesin bir yolu var. Kullanmanız gereken işlev getDateFromDateString (dateString); Temelde bir tarih dizesinin st / nd / rd / th sini kaldırır ve basitçe onu ayrıştırır. SimpleDateFormat'ınızı herhangi bir şeyle değiştirebilirsiniz; bu işe yarayacaktır.

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
Bu soru, bir String oluşturmakla ilgili bir String'i ayrıştırmakla ilgilidir . Ama yine de uygun biri biri her iki yöne ihtiyaç muhtemelen. Ayrıca, bu cevap bu diğer soruyu çözer .
Basil Bourque

3

Greg tarafından sağlanan çözüm ile ilgili tek sorun, "genç" numaralar biten 100'den büyük sayıyı hesaba katmıyor olmasıdır. Örneğin, 111, 111'inci değil 111'inci olmalıdır. Bu benim çözümüm:

/**
 * 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
Hangi durumda bir Gün Ayı dizisinin 31 günden fazla olması gerekir?
SatanEnglish

@SatanEnglish, bu statik fabrika yöntemiyle ilgili iyi olan şey, bir ayın son ekini almaktan daha fazlası için kullanılabilmesidir. :)
Jared Rummler

1
Bu yöntem 11 için st, 12 için nd ve 13 için rd döndürür
TheIT

@SatanEnglish. Bugün seçim takvimimde 137 Şubat olduğu düşünüldüğünde, sorunuzun kendisine cevap verdiğini düşünüyorum. Yine de, nereye bakacağınızı biliyorsanız Gregoryen olmayan takvimler bol miktarda bulunur.
Mad Physicist

Hayır, @ TheIT, öyle değil. Test ettim. Gerektiği thgibi 11, 12 ve 13 için geri döner . if ( hunRem - tenRem == 10 )Davanın bunu sağladığına inanıyorum .
Ole VV

2

RuleBasedNumberFormat yoğun bakım kütüphanesinde

@ Pierre-Olivier Dybman'dan ( http://www.icu-project.org/apiref/icu4j/com/ibm/icu/text/RuleBasedNumberFormat.html ) ICU projesinin kütüphanesine olan bağlantıyı takdir ettim , ancak yine de anlamak zorundaydım nasıl kullanılacağını açıkladığımızdan, RuleBasedNumberFormatkullanım örneği aşağıdadır.

Tüm tarih yerine yalnızca tek bir sayı biçimlendirir; bu nedenle, biçimdeki bir tarih arıyorsanız kombine bir dize oluşturmanız gerekir: örneğin, 3 Şubat Pazartesi.

Aşağıdaki kod RuleBasedNumberFormat, belirli bir Yerel Ayar için Ordinal biçimini ayarlar , a oluşturur java.time ZonedDateTimeve ardından ordinal ile bir dize haline getirir.

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

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

Örnek çıktı:

3 üncü

Veya

4

vb.


1

Burada, bir DateTimeFormatter kalıbını, kalıbı bulursa doğru sonek değişmeziyle güncelleyen bir yaklaşımdır; d'00'örneğin, 1'inci gün için onunla değiştirilir d'st'. Kalıp güncellendikten sonra, gerisini yapmak için DateTimeFormatter'a beslenebilir.

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

Orijinal desenin her biçimlendirme çağrısından hemen önce güncellenmesini gerektirir, örn.

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

Bu nedenle, biçimlendirme kalıbı Java kodunun dışında, örneğin bir şablonda tanımlanmışsa, deseni Java'da tanımlayabileceğinizi ve ardından @ OleV.V tarafından yanıtladığınız durumlarda yararlıdır. daha uygun olabilir


1
Yaratıcı ve kıvrımlı. Nasıl çalıştığını anlamak uzun zamanımı aldı. Bu iyi bir kodun işareti değil.
Ole VV

1
@ OleV.V. Geri bildirim için teşekkürler - Biraz yeniden yapılandırdım, bu yüzden biraz daha az ayrıntılı. Yaklaşmanızı gördüm ve beğendim! Her iki yaklaşımın da farklı takaslarla geçerli olduğunu düşünüyorum. Sizinki biçimlendirme noktasında başka bir desteğe ihtiyaç duymaz, ancak Java kodunda desen tanımını engelleyen oluşturucu kullanılarak desenin tanımlanmasını gerektirir. Yaklaşımım, biçimlendirme noktasında ek destek gerektiriyor, ancak deseni oluşturmak için oluşturucuya bağımlılık yok, bu nedenle deseni tanımlanabileceği yerde biraz daha esnek hale getiriyor. Gereksinimlerim ikincisini dikte etti
tazmaniax

3
Artıları ve eksileri çok güzel bir açıklama. Cevaba eklemek ister misiniz? Sadece bir fikir.
Ole VV

1

Bunun için kalıp almak için kendime yardımcı bir yöntem yazdım.

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

ve sonra şöyle diyebiliriz

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

çıktı

December 12th, 2018

Bu minimum 26 API gerektirir :)
Mikkel Larsen

@MikkelLarsen Bu soru android hakkında değildi, bunun için Java 8 kullanıyordum. Android, java 8 için büyük bir
API'yı

@SamSakerz my bad :)
Mikkel Larsen

@MikkelLarsen Java.time işlevlerinin çoğu , ThreeTen-Backport projesinde Java 6 ve Java 7'ye geri yüklenmiştir . Daha önceki ThreeTenABP Android (<26) için uyarlanmıştır . Bkz . ThreeTenABP nasıl kullanılır… .
Basil Bourque

1

Aşağıdaki fonksiyonu deneyin:

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

Eski bir soruyu cevaplarken, özellikle de zaten kabul edilmiş bir cevabı olan bir soru için cevabınızın nasıl yardımcı olduğunu açıklamak için bir bağlam eklediyseniz, cevabınız diğer StackOverflow kullanıcıları için çok daha yararlı olacaktır. Bakınız: İyi bir cevabı nasıl yazarım .
David Buck

Katkıda bulunmak istediğiniz için teşekkür ederiz. Bence kullanmayın tavsiye Date, Calendarve SimpleDateFormat. Bu sınıflar kötü tasarlanmış ve çok eski, sonuncusu özellikle de zahmetli. Bunun yerine LocalDateve DateTimeFormatterhem java.time'dan modern Java tarih ve saat API'sını kullanın . Ayrıca, cevabınızın diğer 18 yanıta neyin katkıda bulunduğundan şüpheliyim?
Ole VV

0

Kotlin'de şöyle kullanabilirsiniz

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

böyle ayarla

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

-3

Aşağıdaki yöntem, kendisine iletilen tarihin biçimlendirilmiş dizesini almak için kullanılabilir. Java'da SimpleDateFormat kullanarak tarihi 1., 2., 3., 4. diyecek şekilde biçimlendirir. ör .: 1 Eylül 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

Aşağıdakiler, stili zor kodlamaktan ziyade soruya daha etkili bir cevaptır.

Günü sıra numarasına değiştirmek için aşağıdaki soneki kullanmanız gerekir .

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

OR to spell the number add SP to the format

DD + SPTH = DDSPTH   result >>> FOURTH

Bu soruda tamamladığım cevabı bul .


Soru, Java veritabanında Oracle veritabanında değil biçimlendirmektir docs.oracle.com/cd/B12037_01/server.101/b10759/… Java, tarih için SimpleDateFormat kullanın: 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";
  }
}

EndWith (); hangi çıktı üretir
Rahul Sharma
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.