Dize olarak ay adı


91

Ayın adını Dize olarak döndürmeye çalışıyorum, örneğin "Mayıs", "Eylül", "Kasım".

Denedim:

int month = c.get(Calendar.MONTH);

Bununla birlikte, bu tamsayıları döndürür (sırasıyla 5, 9, 11). Ay adını nasıl alabilirim?

Yanıtlar:


88

GetDisplayName kullanın .

Daha önceki API kullanımı için String.format(Locale.US,"%tB",c);


Bir sorunum var: getDisplayName (month, Calendar.LONG, Locale.US) Ve Eclipse bana Calendar.LONG veya Calendar.SHORT olmadığını söylüyor.
Gaby

Bu çok tuhaf. java.util.CalendarBaşka bir Calendarsınıf kullanmıyorsun , değil mi?
gerçek

Evet. Görünüşe göre getDisplayName () ve ilişkili Calendar.LONG ve Calendar.SHORT yalnızca API seviyesi 9'dur. Bu yüzden, 9. seviye için işe yarıyor, ancak 7. seviyeye ihtiyacım var :(
Gaby

3
Formatter f = new Formatter();(isteğe bağlı olarak bir yerel ayar verebilirsiniz) sonra String monthName = f.format("%tB",c).toString();veya %tbkısa ad için.
gerçek

5
ayrıca Locale.US yerine Locale.getDefault () kullanmak iyi bir fikir olabilir :)
Shine

163

Bunu kullan :

Calendar cal=Calendar.getInstance();
SimpleDateFormat month_date = new SimpleDateFormat("MMMM");
String month_name = month_date.format(cal.getTime());

Ay adı tam ay adını içerecektir, eğer kısa ay adı istiyorsanız bunu kullanın

 SimpleDateFormat month_date = new SimpleDateFormat("MMM");
 String month_name = month_date.format(cal.getTime());

13
İlk durum için "MMMM" yeterli olacaktır.
yanchenko

119

Dize değişkeninde ayı almak için aşağıdaki kodu kullanın

Örneğin Eylül ayı:

M -> 9

MM -> 09

MMM -> Eylül

MMMM -> Eylül

String monthname=(String)android.text.format.DateFormat.format("MMMM", new Date())

1
evet, teşekkürler, kullandığım tüm dillerde (fransızca, ingilizce, almanca) bir cazibe gibi çalışıyor
Chrysotribax

46

"MMMM" kesinlikle doğru çözüm DEĞİLDİR (birçok dilde çalışsa bile), "LLLL" kalıbını kullanın SimpleDateFormat

Bağımsız ay adları için ICU uyumlu uzantı olarak 'L' desteği, Haziran 2010'da Android platformuna eklendi .

İngilizcede 'MMMM' ve 'LLLL' ile kodlama arasında bir fark olmasa bile, diğer dilleri de düşünmelisiniz.

Örneğin Calendar.getDisplayName, Rusça ile Ocak ayı için "MMMM" kalıbını veya "MMMM" kalıbını kullanırsanız elde edeceğiniz şey budur Locale:

января (tam bir tarih dizesi için doğrudur: " 10 января, 2014 ")

ancak bağımsız bir ay adı olması durumunda şunları beklersiniz:

январь

Doğru çözüm şudur:

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

Tüm çevirilerin nereden geldiği ile ilgileniyorsanız - burada gregorian takvim çevirilerine referans var (sayfanın üst kısmında bağlantılı diğer takvimler).


1
'LLLL' yalnızca Java 8'den beri mevcuttur, SimpleDateFormat ile 'MMMM' kullanabilirsiniz ve bağımsız sürüm için de mükemmel şekilde çalışır.
juanheyns

Açıkça söylemek gerekirse, Rusça'da "Января", "Ocak" anlamına gelen genel durumdur, "Январь" ise "Ocak" anlamına gelir. Ukraynaca ve Sırpça gibi bu ayrıma sahip başka Slav dilleri olabilir. Bu sadece gramerdir ve genellikle çok önemli değildir. Ancak bu yanıtta verilen kullanım durumları dilbilgisi açısından doğrudur: Mümkün olduğunca doğru olmak istiyorsanız, tam tarihler için MMMM'yi ve ayı kendi başına görüntülerken LLLL'yi kullanın.
moonlightcheese

teşekkür ederim, Rusça dil davasıyla
boğuşuyordum

26

Bu kadar basit

mCalendar = Calendar.getInstance();    
String month = mCalendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());

Calendar.LONG, ayın tam adını almaktır ve Calendar.SHORT kısaca ismini verir. Örneğin: Calendar.LONG, Ocak Takvimini döndürür.SHORT, Jan döndürür


Mükemmel cevap. Takvimi alarm için kendim ayarlıyordum ve ay adını daha sonra almam gerekiyordu. Mükemmel cevap Teşekkür ederim
Ajji

10

Diğer durumlar için faydalı olan bu cevabı saklıyorum ama @trutheality cevabı en basit ve doğrudan yol gibi görünüyor.

DateFormatSymbols kullanabilirsiniz

DateFormatSymbols(Locale.FRENCH).getMonths()[month]; // FRENCH as an example

5

Ukraynaca, Rusça, Çekçe gibi diller için düzgün biçimlendirilmiş tek başına ay adı almanın Android'de tek yolu

private String getMonthName(Calendar calendar, boolean short) {
    int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NO_MONTH_DAY | DateUtils.FORMAT_NO_YEAR;
    if (short) {
        flags |= DateUtils.FORMAT_ABBREV_MONTH;
    }
    return DateUtils.formatDateTime(getContext(), calendar.getTimeInMillis(), flags);
}

API 15-25'te test edildi

İçin çıktı Mayıs olduğunu Май ancak Мая


3

Rusça.

Month
.MAY
.getDisplayName(
    TextStyle.FULL_STANDALONE ,
    new Locale( "ru" , "RU" )
)

май

Amerika Birleşik Devletleri'nde İngilizce.

Month
.MAY
.getDisplayName(
    TextStyle.FULL_STANDALONE ,
    Locale.US
)

Mayıs

Bu koda IdeOne.com'da canlı olarak bakın .

ThreeTenABP ve java.time

İşte modern cevap. Bu soru 2011'de sorulduğunda Calendarve GregorianCalendarher zaman kötü tasarlanmış olmalarına rağmen genellikle tarihler ve saatler için kullanıldı. Bu 8 yıl önceydi ve bu sınıflar çoktan modası geçmiş durumda. Henüz API seviyesi 26'da olmadığınızı varsayarsak, önerim, modern Java tarih ve saat API'si olan java.time'ın Android uyarlamalı arka portunu içeren ThreeTenABP kitaplığını kullanmaktır. java.time ile çalışmak çok daha güzel.

Tam ihtiyaçlarınıza ve durumunuza bağlı olarak iki seçenek vardır:

  1. Kullanım Monthve getDisplayNameyöntemi.
  2. Bir DateTimeFormatter.

Ayı Kullan

    Locale desiredLanguage = Locale.ENGLISH;
    Month m = Month.MAY;
    String monthName = m.getDisplayName(TextStyle.FULL, desiredLanguage);
    System.out.println(monthName);

Bu kod parçacığının çıktısı:

Mayıs

Birkaç dilde, TextStyle.FULLya da kullanmanız fark yaratacaktır TextStyle.FULL_STANDALONE. İkisinden hangisinin sizin bağlamınıza uyduğunu görmeniz, belki kullanıcılarınızla kontrol etmeniz gerekecektir.

DateTimeFormatter kullanın

Günün saati olan veya olmayan bir randevunuz varsa, DateTimeFormatterdaha pratik buluyorum . Örneğin:

    DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("MMMM", desiredLanguage);

    ZonedDateTime dateTime = ZonedDateTime.of(2019, 5, 31, 23, 49, 51, 0, ZoneId.of("America/Araguaina"));
    String monthName = dateTime.format(monthFormatter);

ZonedDateTimeEski Calendarsınıfın yerine en yakın olan a'nın kullanımını gösteriyorum . Yukarıdaki kod için çalışacak LocalDatebir, LocalDateTime, MonthDay, OffsetDateTimeve bir YearMonthde.

Ya Calendareski bir API'den henüz java.time'a yükseltilmemiş bir API aldıysanız? A'ya dönüştürün ZonedDateTimeve yukarıdaki gibi devam edin:

    Calendar c = getCalendarFromLegacyApi();
    ZonedDateTime dateTime = DateTimeUtils.toZonedDateTime(c);

Gerisi öncekiyle aynı.

Soru: java.time, Android API düzey 26'yı gerektirmiyor mu?

java.time, hem eski hem de yeni Android cihazlarda iyi çalışır. Sadece en az Java 6 gerektirir .

  • Java 8 ve sonraki sürümlerde ve daha yeni Android cihazlarda (API düzeyi 26'dan itibaren) modern API yerleşik olarak gelir.
  • Android olmayan Java 6 ve 7 sürümlerinde, modern sınıfların arka portu olan ThreeTen Backport'u edinin (JSR 310 için ThreeTen; alttaki bağlantılara bakın).
  • (Daha eski) Android'de ThreeTen Backport'un Android sürümünü kullanın. Adı ThreeTenABP. Tarih ve saat sınıflarını org.threeten.bpalt paketlerle içe aktardığınızdan emin olun .

Bağlantılar


2

CalendarNesne kullanmanızı öneririm ve Localeay isimleri farklı diller için farklı olduğundan:

// index can be 0 - 11
private String getMonthName(final int index, final Locale locale, final boolean shortName)
{
    String format = "%tB";

    if (shortName)
        format = "%tb";

    Calendar calendar = Calendar.getInstance(locale);
    calendar.set(Calendar.MONTH, index);
    calendar.set(Calendar.DAY_OF_MONTH, 1);

    return String.format(locale, format, calendar);
}

Tam ay adı için örnek:

System.out.println(getMonthName(0, Locale.US, false));

Sonuç: January

Kısa ay adı örneği:

System.out.println(getMonthName(0, Locale.US, true));

Sonuç: Jan


2

Tarih ve saati bu biçimde almanın örnek bir yolu "2018 Kasım 01 16:18:22" bunu kullanın

DateFormat dateFormat = new SimpleDateFormat("yyyy MMM dd HH:mm:ss");
        Date date = new Date();
         dateFormat.format(date);

0

Bağımsız bir ay adı almak, Java'da "doğru" işlemi yapmak şaşırtıcı derecede zordur. (En azından bu yazı itibariyle. Şu anda Java 8 kullanıyorum).

Sorun, Rusça ve Çekçe dahil bazı dillerde, ay adının bağımsız sürümünün "biçimlendirme" sürümünden farklı olmasıdır. Ayrıca, görünen o ki, hiçbir Java API size sadece "en iyi" dizeyi vermez. Şimdiye kadar burada yayınlanan yanıtların çoğu yalnızca biçimlendirme sürümünü sunuyor. Aşağıda yapıştırılan, tek bir ay adının bağımsız sürümünü veya hepsiyle bir dizi elde etmek için çalışan bir çözümdür.

Umarım bu başka birine biraz zaman kazandırır!

/**
 * getStandaloneMonthName, This returns a standalone month name for the specified month, in the
 * specified locale. In some languages, including Russian and Czech, the standalone version of
 * the month name is different from the version of the month name you would use as part of a
 * full date. (Different from the formatting version).
 *
 * This tries to get the standalone version first. If no mapping is found for a standalone
 * version (Presumably because the supplied language has no standalone version), then this will
 * return the formatting version of the month name.
 */
private static String getStandaloneMonthName(Month month, Locale locale, boolean capitalize) {
    // Attempt to get the standalone version of the month name.
    String monthName = month.getDisplayName(TextStyle.FULL_STANDALONE, locale);
    String monthNumber = "" + month.getValue();
    // If no mapping was found, then get the formatting version of the month name.
    if (monthName.equals(monthNumber)) {
        DateFormatSymbols dateSymbols = DateFormatSymbols.getInstance(locale);
        monthName = dateSymbols.getMonths()[month.getValue()];
    }
    // If needed, capitalize the month name.
    if ((capitalize) && (monthName != null) && (monthName.length() > 0)) {
        monthName = monthName.substring(0, 1).toUpperCase(locale) + monthName.substring(1);
    }
    return monthName;
}

/**
 * getStandaloneMonthNames, This returns an array with the standalone version of the full month
 * names.
 */
private static String[] getStandaloneMonthNames(Locale locale, boolean capitalize) {
    Month[] monthEnums = Month.values();
    ArrayList<String> monthNamesArrayList = new ArrayList<>();
    for (Month monthEnum : monthEnums) {
        monthNamesArrayList.add(getStandaloneMonthName(monthEnum, locale, capitalize));
    }
    // Convert the arraylist to a string array, and return the array.
    String[] monthNames = monthNamesArrayList.toArray(new String[]{});
    return monthNames;
}
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.