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:
GetDisplayName kullanın .
Daha önceki API kullanımı için String.format(Locale.US,"%tB",c);
java.util.Calendar
Başka bir Calendar
sınıf kullanmıyorsun , değil mi?
Formatter f = new Formatter();
(isteğe bağlı olarak bir yerel ayar verebilirsiniz) sonra String monthName = f.format("%tB",c).toString();
veya %tb
kısa ad için.
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());
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())
"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).
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
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
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 Мая
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 .
İşte modern cevap. Bu soru 2011'de sorulduğunda Calendar
ve GregorianCalendar
her 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:
Month
ve getDisplayName
yöntemi.DateTimeFormatter
. 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.FULL
ya 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.
Günün saati olan veya olmayan bir randevunuz varsa, DateTimeFormatter
daha 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);
ZonedDateTime
Eski Calendar
sınıfın yerine en yakın olan a'nın kullanımını gösteriyorum . Yukarıdaki kod için çalışacak LocalDate
bir, LocalDateTime
, MonthDay
, OffsetDateTime
ve bir YearMonth
de.
Ya Calendar
eski bir API'den henüz java.time'a yükseltilmemiş bir API aldıysanız? A'ya dönüştürün ZonedDateTime
ve yukarıdaki gibi devam edin:
Calendar c = getCalendarFromLegacyApi();
ZonedDateTime dateTime = DateTimeUtils.toZonedDateTime(c);
Gerisi öncekiyle aynı.
java.time, hem eski hem de yeni Android cihazlarda iyi çalışır. Sadece en az Java 6 gerektirir .
org.threeten.bp
alt paketlerle içe aktardığınızdan emin olun .java.time
ilk açıklandığı yer.java.time
Java 6 ve 7'nin backport'u (JSR-310 için ThreeTen).Calendar
Nesne kullanmanızı öneririm ve Locale
ay 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
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);
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;
}