आप महीने के दिन को "11 वां", "21 वां" या "23 वां" (क्रमिक सूचक) कैसे कहते हैं?


146

मैं जानता हूँ कि यह मेरे लिए एक संख्या के रूप में महीने के दिन दे देंगे ( 11, 21, 23):

SimpleDateFormat formatDayOfMonth = new SimpleDateFormat("d");

लेकिन आप एक ऑर्डिनल इंडिकेटर को शामिल करने के लिए महीने के दिन को कैसे प्रारूपित करते हैं , कहते हैं 11th, 21stया 23rd?


13
संदर्भ के लिए इन्हें क्रमिक संख्या कहा जाता है - en.wikipedia.org/wiki/Ordinal_number_(linguistics)
ओसोडो

5
सिर्फ रिकॉर्ड के लिए, एक तालिका में पूरे उत्तर को देखने के बजाय प्रतिक्रिया का निर्माण करने वाली कोई भी चीज़ अन्य भाषाओं के लिए स्थानीय बनाना असंभव है।
थोरबजर्न रेवन एंडरसन

2
जवाब किसी तरह गलत है मेरे उत्तर plz पर एक नज़र है।
J888

2
आधुनिक टिप्पणी: मैं आपको SimpleDateFormatकक्षा से बचने की सलाह देता हूं । यह न केवल लंबे समय तक पुराना है, यह कुख्यात भी परेशान करने वाला है। आज हमारे पास java.timeआधुनिक जावा तिथि और समय एपीआई और इसके बहुत बेहतर हैं DateTimeFormatter
ओले वीवी

संख्या API ( math.tools/api/numbers ) पर एक नज़र डालें । इसे विभिन्न भाषाओं में क्रमबद्ध, कार्डिनल, संख्या के लिए समर्थन दिया गया है, विभिन्न भाषाओं में मुद्रा के रूप में वर्तनी दी गई है
dors

जवाबों:


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 से तालिका अच्छी है, लेकिन चूंकि एक ही जानकारी दोहराई जाती है, यह बग के लिए मौका खोलता है। इस तरह की बग वास्तव में तालिका के लिए 7tnमौजूद है 17tn, और 27tn(यह बग तय हो सकता है क्योंकि स्टैकऑवरफ्लो की तरल प्रकृति के कारण समय बीत जाता है, इसलिए त्रुटि को देखने के लिए उत्तर पर संस्करण इतिहास देखें)।


36
यह वास्तव में सरल डेटा प्रारूप में एक निरीक्षण की तरह लगता है, है ना?
स्टेपवल्स

51
यह अंतर्राष्ट्रीयकरण मजेदार है। : डी
तर्जक

6
@Trejkaz सवाल के दायरे के बाहर :)
ग्रेग मैट्स

3
यह समाधान केवल अंग्रेजी का समर्थन करता है। स्थानीय समाधान के लिए ICU4J से RuleBasedNumberFormat का उपयोग करें।
मित्रविलेपद єसंतोष

7
आप लोग मातम में हैं, और स्वर थोड़ा बदल रहा है। उसकी कोई ज़रूरत नहीं। यह सवाल अंतर्राष्ट्रीयकरण की पेचीदगियों के बारे में नहीं पूछा गया। अंतर्राष्ट्रीयकरण निश्चित रूप से चर्चा करने के लिए एक अच्छा विषय है, लेकिन इसे उस ध्यान के साथ एक और प्रश्न पर किया जाना चाहिए। मैंने इस प्रश्न को हमेशा अंग्रेजी में पूरा करने के लिए एक त्वरित और गंदे तरीके के रूप में व्याख्या किया है। इसलिए, मेरा सुझाव है कि अगर वास्तव में जावा दुनिया में कोई अच्छा समाधान नहीं है जो अंतर्राष्ट्रीयकरण के अनुकूल है कि हम एक परियोजना शुरू करते हैं, जैसे, गीथहब और एक अच्छा समाधान बनाते हैं। मुझे पता है अगर आप रुचि रखते हैं।
ग्रेग मैट्स

51

ऐसा करने के लिए जेडीके में कुछ भी नहीं है।

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

या कैलेंडर का उपयोग कर:

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

@ थोबजोरन-रावन-एंडर्सन की टिप्पणियों के अनुसार, स्थानीयकरण करते समय इस तरह की एक तालिका सहायक हो सकती है:

  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
यदि आप तालिका को पूर्ण "21 वें", "23 वें", "29 वें" भाग में रखते हैं तो इसे अन्य भाषाओं में बाह्यीकृत और स्थानीयकृत किया जा सकता है। सफल सॉफ्टवेयर के लिए जो एक आवश्यकता बन सकती है।
Thorbjørn रेवन एंडरसन

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 कंस्ट्रक्टर को प्रदान किए गए पैटर्न स्ट्रिंग में एकल उद्धरणों को छोड़ते हुए सिर्फ आपके समाधान की कोशिश की। मैं अब देखता हूं कि वे वहां क्यों हैं। मैं java.lang.IllegalArgumentException"एक अवैध पैटर्न चरित्र, टी के कारण हो रहा हूं ।"
ठेठ डैनी

17

प्रश्न थोड़ा पुराना है। चूँकि यह प्रश्न बहुत शोरगुल वाला है, इसलिए मैंने स्थैतिक विधि के साथ एक प्रयोग के रूप में इसे हल किया। बस कॉपी, पेस्ट और उपयोग करें!

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

परीक्षण के लिए

उदाहरण: इसे मुख्य विधि से बुलाओ!

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

आउटपुट:

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

मुझे आधुनिक उत्तर में योगदान देना चाहिए। SimpleDateFormatवर्ग उपयोग जब प्रश्न 8 साल पहले पूछा गया था करने के लिए ठीक था, लेकिन अब आप इसे से बचना चाहिए, क्योंकि यह केवल लंबे समय से पुराना नहीं है, लेकिन यह भी बेहद परेशानी। java.timeइसके बजाय उपयोग करें ।

संपादित करें

DateTimeFormatterBuilder.appendText(TemporalField, Map<Long, String>)इस उद्देश्य के लिए महान है। इसका उपयोग करके हम एक फॉर्मेटर बनाते हैं जो हमारे लिए काम करता है:

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

इस स्निपेट से आउटपुट है:

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

पुराना उत्तर

यह कोड छोटा है, लेकिन IMHO इतना सुंदर नहीं है।

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

इस स्निपेट को चलाना अभी मुझे मिला है

23 वें

कई विशेषताओं में से java.timeएक यह है कि महीने के दिन को एक के रूप में प्राप्त करने के लिए यह सीधा और विश्वसनीय है int, जो स्पष्ट रूप से तालिका से सही प्रत्यय चुनने के लिए आवश्यक है।

मेरा सुझाव है कि आप एक यूनिट टेस्ट भी लिखें।

पुनश्च ऐसा ही एक फ़ॉर्मेटर भी के लिए इस्तेमाल किया जा सकता पार्स करने के लिए एक तारीख की तरह क्रमसूचक संख्या से युक्त स्ट्रिंग 1st, 2ndआदि में किया गया था कि : इस सवाल वैकल्पिक सेकंड के साथ पार्स तारीख - जावा

लिंक: ओरेकल ट्यूटोरियल: उपयोग करने के तरीके की व्याख्या करने का समयjava.time


इस उत्तर को ऊँचा उठाना पसंद करेंगे क्योंकि यह अधिक आधुनिक उत्तर आपके स्वयं के कार्यान्वयन को रोल करने की कोशिश से बेहतर है।
क्रीज

9

यदि आप i18n से अवगत होने का प्रयास करते हैं तो समाधान और भी जटिल हो जाता है।

समस्या यह है कि अन्य भाषाओं में प्रत्यय न केवल संख्या पर निर्भर हो सकता है, बल्कि संज्ञा पर भी निर्भर करता है। उदाहरण के लिए रूसी में यह "2-ой день" होगा, लेकिन "2-ая неделя" (ये मतलब "2 वें दिन", लेकिन "2 वें सप्ताह")। यह लागू नहीं होता है यदि हम केवल दिनों का प्रारूपण करते हैं, लेकिन थोड़ा और सामान्य मामले में आपको जटिलता के बारे में पता होना चाहिए।

मुझे लगता है कि अच्छा समाधान (मेरे पास वास्तव में लागू करने के लिए समय नहीं था) पेरेंट क्लास में पास होने से पहले लोकेल-अवेयर मैसेजफ़ॉर्मैट को लागू करने के लिए SimpleDateFormetter का विस्तार करना होगा। इस तरह से आप "3-rd",% MM को "03-rd" और% MMM को "तीसरा" पाने के लिए मार्च फॉरमेट% M के लिए कहने दें। बाहर से यह वर्ग नियमित SimpleDateFormatter की तरह दिखता है, लेकिन अधिक स्वरूपों का समर्थन करता है। अगर यह पैटर्न गलती से लागू हो जाएगा तो SimpleDateFormetter नियमित रूप से गलत तरीके से फॉर्मेट करेगा, लेकिन फिर भी पढ़ने योग्य होगा।


रूसी में लिंग के बारे में अच्छी बात है, लेकिन यह अतिरिक्त संदर्भ के बिना तकनीकी रूप से% MMM को असंभव बना देगा।
मैड फिजिसिस्ट

@Mad भौतिकविद्, यह सच नहीं है क्योंकि% MMM को महीने में लागू किया जाएगा, इसलिए हम संज्ञा को जानते हैं।
सीएबी

6

यहां कई उदाहरण 11, 12, 13. के लिए काम नहीं करेंगे। यह अधिक सामान्य है और सभी मामलों के लिए काम करेगा।

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

मैं केवल मैनुअल प्रारूपों के आधार पर अंग्रेजी-केवल समाधान के लिए जवाब देने से संतुष्ट नहीं हो सकता। मैं अभी कुछ समय के लिए एक उचित समाधान की तलाश में था और आखिरकार मैंने इसे पा लिया।

आपको RuleBasedNumberFormat का उपयोग करना चाहिए । यह पूरी तरह से काम करता है और यह लोकेल का सम्मान करता है।


3

ऐसा करने का एक सरल और सुनिश्चित तरीका है। आपको जिस फ़ंक्शन का उपयोग करने की आवश्यकता होगी वह getDateFromDateString (dateString) है; यह मूल रूप से एक तारीख स्ट्रिंग के सेंट / एनडी / आरडी / थ को हटा देता है और बस इसे पार्स करता है। आप अपने SimpleDateFormat को कुछ भी बदल सकते हैं और यह काम करेगा।

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
यह उत्तर एक स्ट्रिंग को पार्स करने के बारे में है जबकि प्रश्न एक स्ट्रिंग उत्पन्न करने के बारे में है । लेकिन फिर भी एक उपयुक्त के रूप में दोनों दिशाओं की आवश्यकता है। साथ ही, यह उत्तर इस अन्य प्रश्न को हल करता है ।
तुलसी बोर्क

3

केवल ग्रेग द्वारा प्रदान किए गए समाधान के साथ मुद्दा यह है कि यह "किशोर" संख्या समाप्त होने के साथ 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";
    }
}

6
किस मामले में एक दिन का मासिक अनुक्रम 31 दिनों से अधिक होगा?
शैतान

@ सत्तान्सक, इस स्थिर कारखाने विधि के बारे में अच्छी बात यह है कि इसका उपयोग केवल एक महीने के प्रत्यय प्राप्त करने से अधिक के लिए किया जा सकता है। :)
जेरेड रुम्मलर

1
यह विधि 11 के लिए सेंट, 12 के लिए एन डी और 13 के लिए आर डी
एचआईटी

@SatanEnglish। यह देखते हुए कि आज मेरी पसंद के कैलेंडर में Febrember 137th है, मुझे लगता है कि आपके सवाल का जवाब खुद ही है। गंभीर रूप से हालांकि, गैर-ग्रेगोरियन कैलेंडर लाजिमी है यदि आप जानते हैं कि कहां देखना है।
मैड फिजिसिस्ट

नहीं, @ TheIT, यह नहीं है। मैंने परीक्षण किया। यह th11, 12 और 13 के लिए लौटता है जैसा कि यह चाहिए। मेरा मानना ​​है कि if ( hunRem - tenRem == 10 )मामला यह सुनिश्चित करता है कि यह हो।
ओले वीवी

2

RuleBasedNumberFormat आईसीयू पुस्तकालय में

मैंने @ पियरे-ओलिवियर डायबमैन ( http://www.icu-project.org/apiref/icu4j/com/ibm/icu/icxt/RuleBasedNadFormat.html ) से ICU प्रोजेक्ट की लाइब्रेरी के लिंक की सराहना की , हालांकि अभी भी यह पता लगाना था इसका उपयोग कैसे करें, इसलिए RuleBasedNumberFormatउपयोग का एक उदाहरण नीचे है।

यह पूरी तिथि के बजाय केवल एकल संख्या को प्रारूपित करेगा, इसलिए आपको एक संयुक्त स्ट्रिंग बनाने की आवश्यकता होगी यदि प्रारूप में एक तारीख की तलाश में: सोमवार 3 फरवरी, उदाहरण के लिए।

नीचे दिया गया कोड RuleBasedNumberFormatएक दिए गए लोकेल के लिए एक साधारण प्रारूप के रूप में सेट करता है java.time ZonedDateTime, एक बनाता है , और फिर एक क्रम में एक तार के साथ संख्या को प्रारूपित करता है।

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

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

उदाहरण आउटपुट:

3

या

4

आदि।


1

यहाँ एक दृष्टिकोण है जो सही प्रत्यय शाब्दिक के साथ एक 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);
}

तो यह उपयोगी है अगर स्वरूपण पैटर्न जावा कोड के बाहर परिभाषित किया गया है, उदाहरण के लिए टेम्पलेट, जहां अगर आप जावा में पैटर्न को परिभाषित कर सकते हैं तो @ OleV.V द्वारा उत्तर। अधिक उपयुक्त हो सकता है


1
रचनात्मक और दृढ़। यह समझने में मुझे बहुत समय लगा कि यह कैसे काम करता है। यह अच्छे कोड का संकेत नहीं है।
ओले वीवी

1
@ OleV.V। प्रतिक्रिया के लिए thx - मैंने इसे थोड़ा पुनर्गठित किया है इसलिए यह एक छोटी सी क्रिया है। बस अपना दृष्टिकोण देखा और मुझे यह पसंद आया! मुझे लगता है कि दोनों दृष्टिकोण अलग-अलग ट्रेड ऑफ के साथ मान्य हैं। तुम्हारा को स्वरूपण के बिंदु पर किसी और समर्थन की आवश्यकता नहीं है, लेकिन गैर जावा कोड में पैटर्न परिभाषा को रोकने वाले बिल्डर का उपयोग करके पैटर्न को परिभाषित करने की आवश्यकता है। मेरे दृष्टिकोण को प्रारूपण के बिंदु पर अतिरिक्त समर्थन की आवश्यकता है लेकिन पैटर्न बनाने के लिए बिल्डर पर कोई निर्भरता नहीं है इसलिए यह थोड़ा अधिक लचीला बनाता है जहां पैटर्न को परिभाषित किया जा सकता है। मेरे आवश्यकताओं बाद तय
tazmaniax

3
पेशेवरों और विपक्ष का बहुत अच्छा खाता। आप इसे उत्तर में शामिल करना चाह सकते हैं? एक विचार है।
ओले वीवी

1

मैंने इसके लिए पैटर्न प्राप्त करने के लिए अपना स्वयं का सहायक तरीका लिखा।

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

इसके लिए न्यूनतम एपीआई 26 की आवश्यकता होती है :)
मिकेल लार्सन

@MikkelLarsen यह सवाल Android के बारे में नहीं था, मैं इसके लिए Java 8 का उपयोग कर रहा था। एंड्रॉइड जावा 8 के लिए एक बड़ी एपीआई का समर्थन नहीं करता है
सैमहॉक

@SamSakerz मेरा बुरा :)
मिकेल लार्सन

@MikkelLarsen अधिकांश java.time कार्यक्षमता को थ्री-बैक-बैकपोर्ट परियोजना में जावा 6 और जावा 7 में वापस पोर्ट किया गया है । तीनटीनबप में पहले के एंड्रॉइड (<26) के लिए अनुकूलित । देखें कि थ्रीटेबैप का उपयोग कैसे करें…
बेसिल बोर्के

1

फ़ंक्शन के नीचे आज़माएँ:

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

जब एक पुराने प्रश्न का उत्तर दिया जाता है, तो आपका उत्तर अन्य StackOverflow उपयोगकर्ताओं के लिए बहुत अधिक उपयोगी होगा यदि आपने यह समझाने के लिए कुछ संदर्भ शामिल किए कि आपका उत्तर कैसे मदद करता है, विशेष रूप से उस प्रश्न के लिए जो पहले से ही स्वीकृत उत्तर है। देखें: कैसे मैं एक अच्छा जवाब लिख सकता हूं
डेविड बक

योगदान करने के लिए धन्यवाद। मेरा सुझाव है कि हम उपयोग न करें Date, Calendarऔर SimpleDateFormat। उन वर्गों को खराब तरीके से डिज़ाइन किया गया है और लंबे समय तक पुराना है, विशेष रूप से कुख्यात परेशानियों में अंतिम। इसके बजाय , जावा जावा, आधुनिक जावा तिथि और समय एपीआई दोनों का उपयोग करें LocalDateऔर । इसके अलावा, मुझे संदेह है कि अन्य 18 उत्तरों की तुलना में आपका उत्तर क्या नया योगदान देता है? DateTimeFormatter
ओले वीवी

0

कोटलिन में आप इस तरह का उपयोग कर सकते हैं

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

-3

निम्न विधि का उपयोग उस तिथि के स्वरूपित स्ट्रिंग को प्राप्त करने के लिए किया जा सकता है जो उसमें पारित हो जाती है। यह जावा में SimpleDateFormat का उपयोग करके 1st, 2nd, 3rd, 4th .. कहने की तारीख को प्रारूपित करेगा। उदाहरण: - 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);
        }

-4

शैली की हार्ड-कोडिंग के बजाय प्रश्न का अधिक कुशल उत्तर निम्नलिखित है।

दिन को क्रमिक संख्या में बदलने के लिए आपको निम्नलिखित प्रत्यय का उपयोग करने की आवश्यकता है ।

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

OR to spell the number add SP to the format

DD + SPTH = DDSPTH   result >>> FOURTH

इस प्रश्न में मेरा पूरा उत्तर खोजें ।


जावा में ऑरेकल डेटाबेस में नहीं प्रारूप करने के लिए प्रश्न है docs.oracle.com/cd/B12037_01/server.101/b10759/… जावा तिथि के लिए SimpleDateFormat का उपयोग करें: docs.oracle.com/javase/putorial/i18n/format/…
बेलाल 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";
  }
}

यह सिरों का उपयोग नहीं करना चाहिए () के साथ; जो गलत आउटपुट देता है
राहुल शर्मा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.