আপনি "একাদশ", "একবিংশ" বা "23 তম" (অর্ডিনাল সূচক) বলতে কীভাবে মাসের দিনটিকে ফর্ম্যাট করবেন?


146

আমি জানি আমার একটি সংখ্যা হিসাবে মাসের দিন দিতে হবে ( 11, 21, 23):

SimpleDateFormat formatDayOfMonth = new SimpleDateFormat("d");

কিন্তু আপনি মাসের দিন কেমন ফরম্যাট একটি অন্তর্ভুক্ত করা না অর্ডিন্যাল সূচক বলো 11th, 21stবা 23rd?


13
রেফারেন্সের জন্য এগুলিকে অর্ডিনাল নাম্বারগুলি বলা হয় - en.wikedia.org/wiki/Ordinal_number_(linguistic)
ocodo

5
কেবল রেকর্ডের জন্য, কোনও টেবিলের পুরো উত্তরটি অনুসন্ধান করার পরিবর্তে প্রতিক্রিয়া তৈরি করা যে কোনও কিছুই অন্য ভাষায় স্থানীয়করণ অসম্ভবের কাছাকাছি।
থরবজর্ন রাভন অ্যান্ডারসন

2
উত্তরটি কোনওভাবে ভুল আমার উত্তর plz এ দেখুন।
J888

2
আধুনিক মন্তব্য: আমি আপনাকে SimpleDateFormatক্লাস এড়ানোর পরামর্শ দিচ্ছি । এটি কেবল দীর্ঘকালীন নয়, এটি কুখ্যাত সমস্যাও বটে। java.timeআধুনিক জাভা তারিখ এবং সময় এপিআই এবং এর মধ্যে আজ আমরা আরও অনেক ভাল DateTimeFormatter
ওলে ভিভি

নম্বরগুলি API ( math.tools/api/numbers ) একবার দেখুন at এতে অর্ডিনাল, কার্ডিনাল, বিভিন্ন ভাষায় বানানযুক্ত নম্বর, বিভিন্ন ভাষায় মুদ্রা হিসাবে বানান ইত্যাদির সমর্থন রয়েছে
ডোরস

উত্তর:


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

@ কালিয়াটেকের টেবিলটি দুর্দান্ত, তবে যেহেতু একই তথ্যটি পুনরাবৃত্তি করা হয়েছে, এটি বাগের সুযোগ খোলে। এই ধরনের একটি বাগ আসলে জন্য টেবিল বিদ্যমান 7tn, 17tnএবং 27tn(যেমন সময় Stackoverflow এর তরল প্রকৃতির কারণে যায়, তাই পরীক্ষা এই বাগ সংশোধন করা হয়েছে পেতে পারে উত্তরে সংস্করণ ইতিহাস ত্রুটিটি দেখেন)।


36
এটি সত্যই সহজ ডেটা ফর্ম্যাটে একটি তদারকির মতো অনুভব করে, তাই না?
স্টিভলস

51
এই আন্তর্জাতিককরণ মজা আছে। : ডি
ট্রেজকাজ

6
@ ট্রেজকাজ প্রশ্নের ক্ষেত্রের বাইরে :)
গ্রেগ ম্যাটেস

3
এই সমাধানটি কেবল ইংরেজী সমর্থন করে। স্থানীয়ীকৃত সমাধানের জন্য আইসিইউ 4 জে থেকে রুলবেসডনम्बरফর্ম্যাট ব্যবহার করুন।
10

7
ছেলেরা আগাছায় ছড়িয়ে পড়ে এবং সুরটি কিছুটা পালা নিচ্ছে। ওটার দরকার নেই. এই প্রশ্নটি আন্তর্জাতিকীকরণের জটিলতা সম্পর্কে জিজ্ঞাসা করেনি। আন্তর্জাতিকীকরণ অবশ্যই আলোচনার জন্য একটি সূক্ষ্ম বিষয়, তবে এটি সেই ফোকাসের সাথে অন্য একটি প্রশ্নে করা উচিত। আমি এই প্রশ্নটি ইংরেজী ভাষায় সম্পূর্ণ করার জন্য দ্রুত এবং নোংরা উপায়ের অনুরোধ হিসাবে সর্বদা ব্যাখ্যা করেছি as সুতরাং, আমি প্রস্তাব দিচ্ছি যে জাভা বিশ্বে যদি সত্যিই কোনও ভাল সমাধান না হয় যেটি আন্তর্জাতিকীকরণ বান্ধব যে আমরা একটি প্রকল্প শুরু করি, যেমন, গিটহাব এবং একটি ভাল সমাধান তৈরি করি। আপনার আগ্রহ থাকলে আমাকে জানান Let
গ্রেগ ম্যাটেস

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
যদি আপনি টেবিলটিতে পূর্ণ "21st", "23 তম", "29 তম" থাকে তবে এটি বহিরাগত এবং অন্যান্য ভাষায় স্থানীয়করণ হতে পারে। সফল সফ্টওয়্যারগুলির জন্য যা প্রয়োজন হতে পারে।
থরবজর্ন রাভন অ্যান্ডারসন

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

সিম্পলডেট ফরমেট কনস্ট্রাক্টরকে সরবরাহ করা প্যাটার্ন স্ট্রিংয়ের একক উদ্ধৃতিগুলি বাদ দিয়ে আমি কেবল আপনার সমাধানটি চেষ্টা করেছি। আমি এখন দেখছি কেন তারা সেখানে আছেন। আমি 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);
    }

Purose পরীক্ষা করার জন্য

উদাহরণ: এটিকে মূল পদ্ধতি থেকে কল করা!

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

পুরানো উত্তর

এই কোডটি ছোট, তবে আইএমএইচও এত মার্জিত নয়।

    // 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ইত্যাদি করা হয়েছিল যে : এই প্রশ্ন ঐচ্ছিক সেকেন্ড দিয়ে বিশ্লেষণ DATE - জাভা

লিঙ্ক: ওরাকল টিউটোরিয়াল: তারিখের সময়টি কীভাবে ব্যবহার করবেন তা ব্যাখ্যা করে java.time


এই উত্তরটি আরও উঁচু হতে পছন্দ করবে কারণ এই আধুনিক উত্তরটি আপনার নিজের প্রয়োগের রোল দেওয়ার চেষ্টা করার চেয়ে ভাল is
Krease

9

আপনি যদি i18n সম্পর্কে সচেতন হওয়ার চেষ্টা করেন তবে সমাধান আরও জটিল হয়ে উঠবে।

সমস্যাটি হ'ল অন্যান্য ভাষায় প্রত্যয়টি কেবলমাত্র সংখ্যার উপরই নির্ভর করে না, তবে এটি সংখ্যার উপরেও নির্ভর করে। উদাহরণস্বরূপ রাশিয়ান ভাষায় এটি "2-ой день" হবে তবে "2-ая неделя" (এর অর্থ "দ্বিতীয় দিন", তবে "দ্বিতীয় সপ্তাহ")। আমরা যদি কেবলমাত্র কয়েকদিন বিন্যাস করি তবে এটি প্রযোজ্য নয়, তবে আরও কিছু সাধারণ ক্ষেত্রে আপনার জটিলতার বিষয়ে সচেতন হওয়া উচিত।

আমি মনে করি চমৎকার সমাধানটি (আসলে বাস্তবায়নের জন্য আমার কাছে সময় ছিল না) হ'ল প্যারেন্ট ক্লাসে যাওয়ার আগে লোকাল-সচেতন মেসেজফর্ম্যাট প্রয়োগ করার জন্য সিম্পলডিটফর্মেটর বাড়ানো হবে। এইভাবে আপনি সমর্থন করতে সক্ষম হবেন মার্চ ফর্ম্যাট% M কে "3-rd" পেতে,% এমএম "" 03-rd "পেতে এবং% এমএমএম" তৃতীয় "পেতে। বাইরে থেকে এই শ্রেণিটি নিয়মিত সিম্পলডেট ফরমেটরের মতো দেখায় তবে আরও ফর্ম্যাটকে সমর্থন করে। এছাড়াও যদি এই প্যাটার্নটি নিয়মিত সিম্পলডেটফর্মেটর দ্বারা ভুলভাবে প্রয়োগ করা হয় তবে ফলাফলটি ভুলভাবে ফর্ম্যাট করা হবে তবে এখনও পঠনযোগ্য।


রাশিয়ান ভাষায় লিঙ্গ সম্পর্কে ভাল বক্তব্য, তবে এটি অতিরিক্ত প্রসঙ্গ ছাড়াই প্রযুক্তিগতভাবে% এমএমএমকে অসম্ভব করে তুলবে।
ম্যাড পদার্থবিদ 1

@ ম্যাড ফিজিজিস্ট, এটি সত্য নয় যেহেতু% এমএমএম মাসের জন্য প্রয়োগ করা হবে, সুতরাং আমরা সংজ্ঞা দেওয়ার বিশেষ্যটি জানি।
সিএবি

6

এখানে উদাহরণগুলির মধ্যে অনেকগুলি 11, 12, 13 এর জন্য কাজ করবে না This এটি আরও সাধারণ এবং এটি সমস্ত ক্ষেত্রে কাজ করবে।

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

ম্যানুয়াল ফর্ম্যাটগুলির উপর ভিত্তি করে ইংরেজী-কেবলমাত্র সমাধানের জন্য কল করা জবাব দিয়ে আমি সন্তুষ্ট হতে পারি না। আমি এখনই কিছু সময়ের জন্য একটি সঠিক সমাধান খুঁজছি এবং অবশেষে আমি এটি খুঁজে পেয়েছি।

আপনার রুলবেসডনম্বার ফর্ম্যাটটি ব্যবহার করা উচিত । এটি নিখুঁতভাবে কাজ করে এবং এটি লোকালের প্রতি শ্রদ্ধাশীল।


3

এটি করার একটি সহজ এবং নিশ্চিত উপায় আছে। আপনার যে ফাংশনটি ব্যবহার করতে হবে তা হ'ল getDateFromDateString (ডেটস্ট্রিং); এটি মূলত তারিখের স্ট্রিংয়ের st / nd / rd / th সরিয়ে দেয় এবং কেবল পার্স করে। আপনি আপনার সিম্পলডিটফর্ম্যাটটিকে যে কোনও কিছুতে পরিবর্তন করতে পারেন এবং এটি কার্যকর হবে।

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
এই উত্তরটি একটি স্ট্রিংকে পার্স করার বিষয়ে যখন প্রশ্নটি একটি স্ট্রিং উত্পন্ন করার বিষয়ে । তবে এখনও উভয় দিকনির্দেশের প্রয়োজন হওয়ায় উপযুক্ত appropriate এছাড়াও, এই উত্তরটি এই অন্যান্য প্রশ্নের সমাধান করে ।
তুলসী বাউরক

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। আজ দেওয়া আমার পছন্দের ক্যালেন্ডারে ফেব্রুয়ারী 137 তম, আমি মনে করি আপনার প্রশ্নটি নিজেই উত্তর দিয়েছে। গুরুতরভাবে যদিও, অ-গ্রেগরিয়ান ক্যালেন্ডারগুলি প্রচুর পরিমাণে রয়েছে যদি আপনি জানেন তবে কোথায়।
ম্যাড পদার্থবিদ

না, থিআইটি, এটি হয় না। আমি পরীক্ষা করেছি। এটি th11, 12 এবং 13 হিসাবে এটির মতো ফেরত দেয় । আমি বিশ্বাস করি if ( hunRem - tenRem == 10 )মামলাটি এটি নিশ্চিত করে।
ওলে ভিভি

2

RuleBasedNumberFormat আইসিইউ লাইব্রেরিতে

আমি @ পিয়েরে-অলিভিয়ার ডাইবম্যানের আইসিইউ প্রকল্পের লাইব্রেরির লিঙ্কটির প্রশংসা করেছি ( http://www.icu-project.org/apiref/icu4j/com/ibm/icu/text/RuleBasedNumberFormat.html ) তবে এখনও তা চিহ্নিত করতে হবে কীভাবে এটি ব্যবহার করবেন তা ব্যবহারের একটি উদাহরণ 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

এখানে একটি পদ্ধতির সাথে ডেটটাইম ফর্ম্যাটর প্যাটার্নটি আপডেট করা হয়েছে যা যথাযথ প্রত্যয়টির সাথে আক্ষরিক সাথে যদি এটি প্যাটার্নটি খুঁজে পায় d'00', উদাহরণস্বরূপ, মাসের 1 দিনের জন্য এটি প্রতিস্থাপন করা হবে d'st'। একবার প্যাটার্নটি আপডেট হয়ে গেলে এটি করার পরে বাকী কাজটি করার জন্য কেবল ডেটটাইম ফর্ম্যাটরে খাওয়ানো যেতে পারে।

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

সুতরাং এটি কার্যকর হয় যদি ফর্ম্যাটিং প্যাটার্নটি জাভা কোডের বাইরে যেমন একটি টেম্পলেট হিসাবে সংজ্ঞায়িত করা হয়, যেখানে আপনি জাভাতে প্যাটার্নটি সংজ্ঞায়িত করতে পারেন তবে উত্তরটি @ ওলেভ.ভি. আরও উপযুক্ত হতে পারে


1
সৃজনশীল এবং সংশ্লেষিত। এটি কীভাবে কাজ করে তা বুঝতে অবশ্যই আমার অনেক সময় লেগেছে। এটি ভাল কোডের লক্ষণ নয়।
ওলে ভিভি

1
@ OleV.V। প্রতিক্রিয়াটির জন্য thx - আমি এটি কিছুটা পুনর্গঠন করেছি যাতে এটি সামান্য বিট কম ভার্বোস হয়। স্রেফ আপনার পন্থা দেখেছি এবং আমি এটি পছন্দ করি! আমি মনে করি উভয় পন্থা বিভিন্ন ট্রেড অফের সাথে বৈধ। আপনার বিন্যাসের বিন্দুতে আর কোনও সহায়তার প্রয়োজন নেই তবে বিল্ডার ব্যবহার করে প্যাটার্নটি সংজ্ঞায়িত করা দরকার যা জাভা কোডে প্যাটার্ন সংজ্ঞাটি পূর্বাভাস দেয়। আমার পদ্ধতির বিন্যাসের সময়ে অতিরিক্ত সমর্থন প্রয়োজন তবে প্যাটার্নটি তৈরি করতে বিল্ডারের উপর নির্ভরতা নেই তাই এটি কিছুটা নমনীয় করে তোলে যেখানে প্যাটার্নটি সংজ্ঞায়িত করা যায়। আমার প্রয়োজনীয়তাগুলি পরবর্তীকালের উপর
নির্ভর করে

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 যদিও :)
মিক্কেল লারসেন

@ মিকেললারসেন এই প্রশ্নটি অ্যান্ড্রয়েড সম্পর্কে নয়, আমি এর জন্য জাভা 8 ব্যবহার করছিলাম। অ্যানড্রয়েড জাভা 8

আমার খারাপ :) @SamSakerz
Mikkel লারসেন

@ মিক্কেললারসেন বেশিরভাগ জাভা.টাইম কার্যকারিতাটি থ্রিটেন-ব্যাকপোর্ট প্রকল্পে জাভা 6 এবং জাভা 7-এ ব্যাক -পোর্ট করা হয়েছেথ্রিটেনএবিপি-তে পূর্ববর্তী অ্যান্ড্রয়েড (<26) এর জন্য আরও অভিযোজিত । দেখুন ThreeTenABP কীভাবে ব্যবহার করতে হয় ...
বাসিল বার্ক

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

কোনও পুরানো প্রশ্নের উত্তর দেওয়ার সময়, অন্য উত্তর স্ট্যাকওভারফ্লো ব্যবহারকারীদের কাছে আপনার উত্তরটি আরও কার্যকর হবে যদি আপনি নিজের উত্তর কীভাবে সহায়তা করে তা ব্যাখ্যা করার জন্য কিছু প্রসঙ্গ অন্তর্ভুক্ত করে, বিশেষত ইতিমধ্যে স্বীকৃত উত্তর রয়েছে এমন একটি প্রশ্নের জন্য। দেখুন: আমি কীভাবে ভাল উত্তর লিখব
ডেভিড বাক

অবদান রাখতে চাওয়ার জন্য ধন্যবাদ আমি আপনাকে ব্যবহার না করার পরামর্শ দিই Date, Calendarএবং SimpleDateFormat। এই ক্লাসগুলি খারাপভাবে নকশাকৃত এবং দীর্ঘকালীন, বিশেষত শেষটি বিশেষভাবে কুখ্যাত সমস্যাযুক্ত। এর পরিবর্তে ব্যবহার LocalDateএবং DateTimeFormatterউভয় থেকে java.time, আধুনিক জাভা তারিখ এবং সময় এপিআই । এছাড়াও আমি সন্দেহ করছি যে অন্য 18 টি উত্তরের তুলনায় আপনার উত্তরটি নতুন কী অবদান রাখে?
ওলে ভিভি

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

নিম্নলিখিত পদ্ধতিটি এতে প্রবেশের তারিখের ফর্ম্যাট স্ট্রিংটি পেতে ব্যবহার করা যেতে পারে। এটি জাভাতে সরলডেটফর্ম্যাট ব্যবহার করে 1 ম, দ্বিতীয়, তৃতীয়, 4 র্থ বলার তারিখটি ফর্ম্যাট করবে। যেমন: - 2015 সালের 1 সেপ্টেম্বর

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

এই প্রশ্নের আমার সম্পূর্ণ উত্তর খুঁজুন ।


প্রশ্নটি জাভায় ফর্ম্যাট করতে হবে ওরাকল ডাটাবেসে নয় ডকস.অরাকল. com/ সিডি
বেলাল 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";
  }
}

এটি শেষগুলি সহ () ব্যবহার করা উচিত নয়; যা ভুল আউটপুট উত্পাদন করে
রাহুল শর্মা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.