আমি কীভাবে কোনও জাভাটিকে স্থানীয়ভাবে মাসিক জাভা হিসাবে রূপান্তর করতে পারি?


101

আমি একটি পূর্ণসংখ্যা পেয়েছি এবং আমাকে বিভিন্ন লোকেলগুলিতে এক মাসের নাম রূপান্তর করতে হবে:

স্থানীয়ভাবে এন-আমাদের জন্য উদাহরণ:
1 -> জানুয়ারী
2 শে -> ফেব্রুয়ারি

স্থানীয়-এসেক্স-এমএক্সের উদাহরণ:
1 -> এনারো
2 -> ফেব্রেরো


5
দেখুন, জাভা মাসগুলি শূন্য-ভিত্তিক তাই 0 = জানুয়ারী, 1 = ফেব্রুয়ারি, ইত্যাদি
নিক হল্ট

আপনি সঠিক, তাই যদি ভাষা পরিবর্তন করার প্রয়োজন হয় তবে কেবল লোকেল পরিবর্তন করা দরকার to ধন্যবাদ
অ্যাটমসফেট

4
@ নিকহোল্ট আপডেট আপডেট আধুনিক এনাম java.timeMonthএক-ভিত্তিক: জানুয়ারি-ডিসেম্বরের জন্য 1-12। [ java.time.DayOfWeek](https://docs.oracle.com/javase/9/docs/api/java/time/DayOfWeek.html): 1-7 for Monday-Sunday per ISO 8601 standard. Only the troublesome old legacy date-time classes such as ক্যালেন্ডার`-এর জন্য ডিটোতে পাগল সংখ্যা স্কিম রয়েছে। উত্তরাধিকারের ক্লাসগুলি এড়ানোর অনেক কারণগুলির মধ্যে একটি, এখন পুরোপুরি জাভা.টাইম ক্লাসগুলি দ্বারা পরিপূর্ণ
বাসিল বাউর্ক

উত্তর:


214
import java.text.DateFormatSymbols;
public String getMonth(int month) {
    return new DateFormatSymbols().getMonths()[month-1];
}

12
অ্যারে শূন্য ভিত্তিক হওয়ায় আপনার কি 'মাস -১' দরকার নেই? অ্যাটমসফ্যাট 1 -> জানুয়ারী ইত্যাদি চায়
ব্রায়ান

7
তার দরকার মাস -১, কারণ মাসটি 1-ভিত্তিক মাসের সংখ্যা যা শূন্য-ভিত্তিক অ্যারে অবস্থানে রূপান্তরিত করা দরকার
স্যাম বার্নুম

5
পাবলিক স্ট্রিং getMonth (int মাস, লোকালে লোকেল) Date ফিরুন তারিখফর্ম্যাটসিম্বলস.সেট ইনসট্যান্স (লোকেল) .getMonths () [মাস -1]; }
অ্যাটমসফ্যাট

4
তাঁর দরকার month-1। অন্য যে কেউ ব্যবহার করছেন Calendar.get(Calendar.MONTH)তার প্রয়োজন পড়বেmonth
রন

4
তারিখফর্ম্যাটসিম্বলসের বাস্তবায়ন জেডিকে ৮-এ পরিবর্তিত হয়েছে, সুতরাং getMonths পদ্ধতিটি এখন সমস্ত লোকালের জন্য সঠিক মানগুলি ফিরিয়ে দেয় না: oracle.com/technetwork/java/javase/…
আহমান

33

একা একা একা একা নাম রাখার জন্য আপনাকে এলএলএলএল ব্যবহার করতে হবে। এটি ডকুমেন্টেশনে SimpleDateFormatনথিবদ্ধ, যেমন:

SimpleDateFormat dateFormat = new SimpleDateFormat( "LLLL", Locale.getDefault() );
dateFormat.format( date );

IllegalArgumentException : Illegal pattern character 'L'
জেডিকে

27

tl; ডা

Month                             // Enum class, predefining and naming a dozen objects, one for each month of the year. 
.of( 12 )                         // Retrieving one of the enum objects by number, 1-12. 
.getDisplayName(
    TextStyle.FULL_STANDALONE , 
    Locale.CANADA_FRENCH          // Locale determines the human language and cultural norms used in localizing. 
)

java.time

জাভা 1.8 (বা থ্রিটেন-ব্যাকপোর্ট সহ 1.7 এবং 1.6 ) যেহেতু আপনি এটি ব্যবহার করতে পারেন:

Month.of(integerMonth).getDisplayName(TextStyle.FULL_STANDALONE, locale);

নোটটি integerMonth1-ভিত্তিক, অর্থাৎ 1 জানুয়ারীর জন্য। জানুয়ারী-ডিসেম্বর (যেমন গ্রেগরিয়ান ক্যালেন্ডার) এর জন্য সবসময় ব্যাপ্তি 1 থেকে 12 অবধি থাকে।


ধরা যাক যে আপনি পোস্ট করেছেন পদ্ধতিটি ব্যবহার করে ফরাসি ভাষায় মে মাসের স্ট্রিং মাস রয়েছে (ফরাসী ভাষায় মেই মাই), আমি এই স্ট্রিং থেকে কীভাবে 5 নম্বর পেতে পারি ??

@usertest আমি মোটামুটি খসড়া বর্গ লিখেছিলেন MonthDelocalizerমধ্যে আমার উত্তর একটি পেতে Month: একটি গৃহীত স্থানীয় মাস নাম স্ট্রিং থেকে অবজেক্ট mai→ Month.MAY। নোট করুন যে কেস-সংবেদনশীলতা সম্পর্কিত বিষয়গুলি: ফরাসি ভাষায়, Maiএটি অবৈধ এবং হওয়া উচিত mai
বাসিল বাউর্ক

এটি 2019. এটি শীর্ষ উত্তরটি কীভাবে নয়?
আরেকটি নোড

16

আমি সিম্পলডেটফর্ম্যাটটি ব্যবহার করব। কেউ যদি আমাকে সংশোধিত ক্যালেন্ডার বানানোর আরও সহজ উপায় থাকে তবে আমাকে সংশোধন করা উচিত, আমি এখনই কোডটিতে এটি করি এবং আমি এতটা নিশ্চিত নই।

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;


public String formatMonth(int month, Locale locale) {
    DateFormat formatter = new SimpleDateFormat("MMMM", locale);
    GregorianCalendar calendar = new GregorianCalendar();
    calendar.set(Calendar.DAY_OF_MONTH, 1);
    calendar.set(Calendar.MONTH, month-1);
    return formatter.format(calendar.getTime());
}

এই ভয়ানক শ্রেণীর এখন উত্তরাধিকার, আধুনিক দ্বারা সম্পূর্ণরূপে supplanted হয় java.time JSR 310. সংজ্ঞায়িত শ্রেণীর
বেসিল Bourque

14

আমি এটি কিভাবে করব তা এখানে। আমি আপনার উপর পরিসীমা চেকিং ছেড়ে যাব int month

import java.text.DateFormatSymbols;

public String formatMonth(int month, Locale locale) {
    DateFormatSymbols symbols = new DateFormatSymbols(locale);
    String[] monthNames = symbols.getMonths();
    return monthNames[month - 1];
}

12

সিম্পলডেট ফরমেট ব্যবহার করা।

import java.text.SimpleDateFormat;

public String formatMonth(String month) {
    SimpleDateFormat monthParse = new SimpleDateFormat("MM");
    SimpleDateFormat monthDisplay = new SimpleDateFormat("MMMM");
    return monthDisplay.format(monthParse.parse(month));
}


formatMonth("2"); 

ফলাফল: ফেব্রুয়ারি


7

স্পষ্টতই অ্যান্ড্রয়েড ২.২ এ সিম্পলডেট ফরমেট সহ একটি বাগ রয়েছে।

মাসের নাম ব্যবহার করার জন্য আপনাকে সেগুলি আপনার সংস্থানগুলিতে নিজেরাই সংজ্ঞায়িত করতে হবে:

<string-array name="month_names">
    <item>January</item>
    <item>February</item>
    <item>March</item>
    <item>April</item>
    <item>May</item>
    <item>June</item>
    <item>July</item>
    <item>August</item>
    <item>September</item>
    <item>October</item>
    <item>November</item>
    <item>December</item>
</string-array>

এবং তারপরে এগুলিকে আপনার কোডগুলিতে ব্যবহার করুন:

/**
 * Get the month name of a Date. e.g. January for the Date 2011-01-01
 * 
 * @param date
 * @return e.g. "January"
 */
public static String getMonthName(Context context, Date date) {

    /*
     * Android 2.2 has a bug in SimpleDateFormat. Can't use "MMMM" for
     * getting the Month name for the given Locale. Thus relying on own
     * values from string resources
     */

    String result = "";

    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    int month = cal.get(Calendar.MONTH);

    try {
        result = context.getResources().getStringArray(R.array.month_names)[month];
    } catch (ArrayIndexOutOfBoundsException e) {
        result = Integer.toString(month);
    }

    return result;
}

"স্পষ্টতই অ্যান্ড্রয়েড ২.২ এ একটি বাগ রয়েছে" - আপনি বাগটি যেখানে ট্র্যাক করেছেন সেখানে লিঙ্ক করতে পারলে এটি কার্যকর হবে।
পিটার হল

6

tl; ডা

Month.of( yourMonthNumber )           // Represent a month by its number, 1-12 for January-December. 
  .getDisplayName(                    // Generate text of the name of the month automatically localized. 
      TextStyle.SHORT_STANDALONE ,    // Specify how long or abbreviated the name of month should be.
      new Locale( "es" , "MX" )       // Locale determines (a) the human language used in translation, and (b) the cultural norms used in deciding issues of abbreviation, capitalization, punctuation, and so on.
  )                                   // Returns a String.

java.time.Month

জাভা.টাইম ক্লাসগুলিতে এই কাজগুলি করা পুরানো উত্তরাধিকারের তারিখ-সময় ক্লাসগুলিকে দমন করার পক্ষে এখন আরও সহজ কাজ।

MonthEnum এক ডজন বস্তু, প্রতিটি মাসের জন্য এক সংজ্ঞায়িত করে।

মাসগুলি জানুয়ারি-ডিসেম্বরের জন্য 1-12 নম্বরযুক্ত হয়।

Month month = Month.of( 2 );  // 2 → February.

অবজেক্টটিকে মাসের নামের একটি স্ট্রিং তৈরি করতে বলুন , স্বয়ংক্রিয়ভাবে স্থানীয়ীকৃত

TextStyleআপনি নামটি কত দিন বা সংক্ষেপে উল্লেখ করতে চান তা সামঞ্জস্য করুন । মনে রাখবেন যে কয়েকটি ভাষায় (ইংরেজি নয়) একা বা সম্পূর্ণ তারিখের অংশ হিসাবে মাসের নাম পরিবর্তিত হয়। সুতরাং প্রতিটি পাঠ্য শৈলীর একটি …_STANDALONEবৈকল্পিক রয়েছে।

Localeনির্ধারণ করতে একটি নির্দিষ্ট করুন :

  • অনুবাদে কোন মানব ভাষা ব্যবহার করা উচিত।
  • সংক্ষিপ্তসার, বিরামচিহ্ন এবং মূলধনের মতো বিষয়গুলি কী সাংস্কৃতিক মানদণ্ডে স্থির করা উচিত।

উদাহরণ:

Locale l = new Locale( "es" , "MX" );
String output = Month.FEBRUARY.getDisplayName( TextStyle.SHORT_STANDALONE , l );  // Or Locale.US, Locale.CANADA_FRENCH. 

নাম → Monthঅবজেক্ট

এফওয়াইআই, অন্য দিকে যাচ্ছে ( Monthএনাম অবজেক্ট পাওয়ার জন্য মাসের একটি স্ট্রিং পার্স করা ) অন্তর্নির্মিত নয়। আপনি এটি করতে নিজের ক্লাস লিখতে পারেন। এই জাতীয় ক্লাসে আমার দ্রুত চেষ্টা এখানে। আপনার নিজের ঝুঁকিতে ব্যবহার করুন । আমি এই কোডটি কোনও গুরুতর চিন্তা বা কোনও গুরুতর পরীক্ষা দিয়েছি।

ব্যবহার

Month m = MonthDelocalizer.of( Locale.CANADA_FRENCH ).parse( "janvier" ) ;  // Month.JANUARY

কোড।

package com.basilbourque.example;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.time.Month;
import java.time.format.TextStyle;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

// For a given name of month in some language, determine the matching `java.time.Month` enum object.
// This class is the opposite of `Month.getDisplayName` which generates a localized string for a given `Month` object.
// Usage… MonthDelocalizer.of( Locale.CANADA_FRENCH ).parse( "janvier" ) → Month.JANUARY
// Assumes `FormatStyle.FULL`, for names without abbreviation.
// About `java.time.Month` enum: https://docs.oracle.com/javase/9/docs/api/java/time/Month.html
// USE AT YOUR OWN RISK. Provided without guarantee or warranty. No serious testing or code review was performed.
public class MonthDelocalizer
{
    @NotNull
    private Locale locale;

    @NotNull
    private List < String > monthNames, monthNamesStandalone; // Some languages use an alternate spelling for a “standalone” month name used without the context of a date.

    // Constructor. Private, for static factory method.
    private MonthDelocalizer ( @NotNull Locale locale )
    {
        this.locale = locale;

        // Populate the pair of arrays, each having the translated month names.
        int countMonthsInYear = 12; // Twelve months in the year.
        this.monthNames = new ArrayList <>( countMonthsInYear );
        this.monthNamesStandalone = new ArrayList <>( countMonthsInYear );

        for ( int i = 1 ; i <= countMonthsInYear ; i++ )
        {
            this.monthNames.add( Month.of( i ).getDisplayName( TextStyle.FULL , this.locale ) );
            this.monthNamesStandalone.add( Month.of( i ).getDisplayName( TextStyle.FULL_STANDALONE , this.locale ) );
        }
//        System.out.println( this.monthNames );
//        System.out.println( this.monthNamesStandalone );
    }

    // Constructor. Private, for static factory method.
    // Personally, I think it unwise to default implicitly to a `Locale`. But I included this in case you disagree with me, and to follow the lead of the *java.time* classes. --Basil Bourque
    private MonthDelocalizer ( )
    {
        this( Locale.getDefault() );
    }

    // static factory method, instead of  constructors.
    // See article by Dr. Joshua Bloch. http://www.informit.com/articles/article.aspx?p=1216151
    // The `Locale` argument determines the human language and cultural norms used in de-localizing input strings.
    synchronized static public MonthDelocalizer of ( @NotNull Locale localeArg )
    {
        MonthDelocalizer x = new MonthDelocalizer( localeArg ); // This class could be optimized by caching this object.
        return x;
    }

    // Attempt to translate the name of a month to look-up a matching `Month` enum object.
    // Returns NULL if the passed String value is not found to be a valid name of month for the human language and cultural norms of the `Locale` specified when constructing this parent object, `MonthDelocalizer`.
    @Nullable
    public Month parse ( @NotNull String input )
    {
        int index = this.monthNames.indexOf( input );
        if ( - 1 == index )
        { // If no hit in the contextual names, try the standalone names.
            index = this.monthNamesStandalone.indexOf( input );
        }
        int ordinal = ( index + 1 );
        Month m = ( ordinal > 0 ) ? Month.of( ordinal ) : null;  // If we have a hit, determine the `Month` enum object. Else return null.
        if ( null == m )
        {
            throw new java.lang.IllegalArgumentException( "The passed month name: ‘" + input + "’ is not valid for locale: " + this.locale.toString() );
        }
        return m;
    }

    // `Object` class overrides.

    @Override
    public boolean equals ( Object o )
    {
        if ( this == o ) return true;
        if ( o == null || getClass() != o.getClass() ) return false;

        MonthDelocalizer that = ( MonthDelocalizer ) o;

        return locale.equals( that.locale );
    }

    @Override
    public int hashCode ( )
    {
        return locale.hashCode();
    }

    public static void main ( String[] args )
    {
        // Usage example:
        MonthDelocalizer monthDelocJapan = MonthDelocalizer.of( Locale.JAPAN );
        try
        {
            Month m = monthDelocJapan.parse( "pink elephant" ); // Invalid input.
        } catch ( IllegalArgumentException e )
        {
            // … handle error
            System.out.println( "ERROR: " + e.getLocalizedMessage() );
        }

        // Ignore exception. (not recommended)
        if ( MonthDelocalizer.of( Locale.CANADA_FRENCH ).parse( "janvier" ).equals( Month.JANUARY ) )
        {
            System.out.println( "GOOD - In locale "+Locale.CANADA_FRENCH+", the input ‘janvier’ parses to Month.JANUARY." );
        }
    }
}

জাভা.টাইম সম্পর্কে

Java.time ফ্রেমওয়ার্ক জাভা 8 এবং পরে পাতাটা করা হয়। এই শ্রেণীর বিরক্তিজনক পুরাতন স্থানচ্যুত উত্তরাধিকার যেমন তারিখ-সময় শ্রেণীর java.util.Date, Calendar, &SimpleDateFormat

Joda-টাইম প্রকল্প, এখন রক্ষণাবেক্ষণ মোড , এর মাইগ্রেশন উপদেশ java.time ক্লাস।

আরও জানতে, ওরাকল টিউটোরিয়াল দেখুন । এবং অনেকগুলি উদাহরণ এবং ব্যাখ্যাগুলির জন্য স্ট্যাক ওভারফ্লো অনুসন্ধান করুন। স্পেসিফিকেশনটি জেএসআর 310

আপনি আপনার ডাটাবেসের সাথে জাভা.টাইম অবজেক্টগুলি সরাসরি বিনিময় করতে পারেন । জেডিবিসি ৪.২ বা তারপরের সাথে অনুগত একটি জেডিবিসি ড্রাইভার ব্যবহার করুন । স্ট্রিংগুলির দরকার নেই, ক্লাসের প্রয়োজন নেই ।java.sql.*

জাভা.টাইম ক্লাস কোথায় পাবেন?

ThreeTen-অতিরিক্ত প্রকল্প অতিরিক্ত শ্রেণীর সাথে java.time প্রসারিত করে। এই প্রকল্পটি জাভা.টাইমে সম্ভাব্য ভবিষ্যতের সংযোজনগুলির একটি প্রমাণযোগ্য ক্ষেত্র। আপনি এখানে কিছু দরকারী শ্রেণীর যেমন খুঁজে পেতে পারেন Interval, YearWeek, YearQuarter, এবং আরো


1

যখন আপনি নাম অনুসারে মাস পাওয়ার জন্য ডেটফর্ম্যাটসাইমবলস ক্লাসটি তার নামমন্ত্র অনুসারে ব্যবহার করেন তখন এটি কিছু অ্যান্ড্রয়েড ডিভাইসে সংখ্যা অনুসারে মাস দেখায় এমন একটি সমস্যা আছে। আমি এইভাবে এই সমস্যাটি সমাধান করেছি:

স্ট্রিং_আরে.এক্সএমএল এ

<string-array name="year_month_name">
    <item>January</item>
    <item>February</item>
    <item>March</item>
    <item>April</item>
    <item>May</item>
    <item>June</item>
    <item>July</item>
    <item>August</item>
    <item>September</item>
    <item>October</item>
    <item>November</item>
    <item>December</item>
    </string-array>

জাভা ক্লাসে এই অ্যারেটিকে কেবল এভাবে কল করুন:

public String[] getYearMonthName() {
        return getResources().getStringArray(R.array.year_month_names);
        //or like 
       //return cntx.getResources().getStringArray(R.array.month_names);
    } 

      String[] months = getYearMonthName(); 
           if (i < months.length) {
            monthShow.setMonthName(months[i] + " " + year);

            }

শুভ কোডিং :)


1

কোটলিন এক্সটেনশন

fun Int.toMonthName(): String {
    return DateFormatSymbols().months[this]
}

ব্যবহার

calendar.get(Calendar.MONTH).toMonthName()

ভয়ঙ্কর Calendarশ্রেণিটি বছর কয়েক আগে জেএসআর 310-এ সংজ্ঞায়িত জাভা.টাইম ক্লাসগুলির দ্বারা বর্ধিত হয়েছিল
বাসিল

0
    public static void main(String[] args) {
    SimpleDateFormat format = new SimpleDateFormat("MMMMM", new Locale("en", "US"));
    System.out.println(format.format(new Date()));
}

এটিকে যথাযথ উত্তর বলে মনে হচ্ছে তবে আপনি কী করতে পারেন এবং আপনি কেন এইভাবে করেন তা আপনি ব্যাখ্যা করতে পারেন?
মার্টিন ফ্র্যাঙ্ক

আমি এইভাবে করি কারণ আমি মনে করি সহজ এবং জটিল নয়!
ডায়োগো অলিভিরা

SimpleDateFormatযদিও এটি কুখ্যাত সমস্যাযুক্ত এবং দীর্ঘকালীন শ্রেণীর ব্যবহার করে ।
ওলে ভিভি

এই ভয়াবহ তারিখ-কালীন ক্লাসগুলি বছর পূর্বে জেএসআর 310-এ সংজ্ঞায়িত জাভা.টাইম ক্লাস দ্বারা সংবহন করা হয়েছিল।
বাসিল

0

শুধু লাইন tingোকানো হচ্ছে

DateFormatSymbols.getInstance().getMonths()[view.getMonth()] 

কৌতুক করবে


4
DateFormatSymbolsভয়ানক তারিখ-সময় শ্রেণীর যে এখন উত্তরাধিকার হয়, গ্রহণ হিসাবে অংশ JSR 310 । এখন জাভা.টাইম ক্লাস দ্বারা সংক্ষিপ্ত 2019 সালে তাদের ব্যবহারের পরামর্শ দেওয়া হ'ল দুর্বল পরামর্শ।
বেসিল Bourque

এই উত্তর গৃহীত উত্তরের বিষয়বস্তুটিকে নকল করে ।
বেসিল বাউরক

0

এটি খুব সাধারণ উপায়ে ব্যবহার করার চেষ্টা করুন এবং এটিকে নিজের ফানকের মতো কল করুন

public static String convertnumtocharmonths(int m){
         String charname=null;
         if(m==1){
             charname="Jan";
         }
         if(m==2){
             charname="Fev";
         }
         if(m==3){
             charname="Mar";
         }
         if(m==4){
             charname="Avr";
         }
         if(m==5){
             charname="Mai";
         }
         if(m==6){
             charname="Jun";
         }
         if(m==7){
             charname="Jul";
         }
         if(m==8){
             charname="Aou";
         }
         if(m==9){
             charname="Sep";
         }
         if(m==10){
             charname="Oct";
         }
         if(m==11){
             charname="Nov";
         }
         if(m==12){
             charname="Dec";
         }
         return charname;
     }

4
এই জাতীয় কোড লেখার দরকার নেই। জাভা অন্তর্নির্মিত আছে Month::getDisplayName
বাসিল বাউরক

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