Próbuję zwrócić nazwę miesiąca jako ciąg, na przykład „maj”, „wrzesień”, „listopad”.
Próbowałem:
int month = c.get(Calendar.MONTH);
Jednak zwraca to liczby całkowite (odpowiednio 5, 9, 11). Jak mogę uzyskać nazwę miesiąca?
Odpowiedzi:
Użyj getDisplayName .
Do wcześniejszego użycia API String.format(Locale.US,"%tB",c);
java.util.Calendar
a nie innej Calendar
klasy, prawda?
Formatter f = new Formatter();
(opcjonalnie możesz nadać mu locale) wtedy String monthName = f.format("%tB",c).toString();
lub %tb
dla krótkiej nazwy.
Użyj tego :
Calendar cal=Calendar.getInstance();
SimpleDateFormat month_date = new SimpleDateFormat("MMMM");
String month_name = month_date.format(cal.getTime());
Nazwa miesiąca będzie zawierać pełną nazwę miesiąca, jeśli chcesz, aby nazwa miesiąca była krótka, użyj jej
SimpleDateFormat month_date = new SimpleDateFormat("MMM");
String month_name = month_date.format(cal.getTime());
Aby uzyskać miesiąc w zmiennej łańcuchowej, użyj poniższego kodu
Na przykład wrzesień:
M -> 9
MM -> 09
MMM -> wrz
MMMM -> wrzesień
String monthname=(String)android.text.format.DateFormat.format("MMMM", new Date())
„MMMM” zdecydowanie NIE jest właściwym rozwiązaniem (nawet jeśli działa w wielu językach), użyj wzorca „LLLL” z SimpleDateFormat
Wsparcie dla „L” jako rozszerzenia kompatybilnego z ICU dla samodzielnych nazw miesięcy zostało dodane do platformy Android w czerwcu 2010 roku .
Nawet jeśli w języku angielskim nie ma różnicy między kodowaniem przez „MMMM” i „LLLL”, należy również pomyśleć o innych językach.
Np. To, co otrzymujesz, jeśli użyjesz Calendar.getDisplayName
wzoru MMMM na styczeń z rosyjskim Locale
:
января (co jest poprawne w przypadku pełnego ciągu daty: „ 10 января, 2014 ”)
ale w przypadku samodzielnej nazwy miesiąca można się spodziewać:
январь
Właściwe rozwiązanie to:
SimpleDateFormat dateFormat = new SimpleDateFormat( "LLLL", Locale.getDefault() );
dateFormat.format( date );
Jeśli jesteś zainteresowany tym, skąd pochodzą wszystkie tłumaczenia - tutaj znajduje się odniesienie do tłumaczeń kalendarza gregoriańskiego (inne kalendarze linkowane na górze strony).
Tak proste
mCalendar = Calendar.getInstance();
String month = mCalendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());
Calendar.LONG to pełna nazwa miesiąca, a Calendar.SHORT podaje nazwę w skrócie. Na przykład: Calendar.LONG zwróci January Calendar, SHORT zwróci Jan
Zachowuję tę odpowiedź, która jest przydatna w innych przypadkach, ale odpowiedź @trutheality wydaje się być najbardziej prostą i bezpośrednią drogą.
Możesz użyć DateFormatSymbols
DateFormatSymbols(Locale.FRENCH).getMonths()[month]; // FRENCH as an example
Jedyny sposób na Androida, aby uzyskać poprawnie sformatowaną, autonomiczną nazwę miesiąca dla takich języków, jak ukraiński, rosyjski, czeski
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);
}
Testowane na API 15-25
Wyjście na maj to Май, ale nie Мая
Rosyjski.
Month
.MAY
.getDisplayName(
TextStyle.FULL_STANDALONE ,
new Locale( "ru" , "RU" )
)
май
Angielski w Stanach Zjednoczonych.
Month
.MAY
.getDisplayName(
TextStyle.FULL_STANDALONE ,
Locale.US
)
Może
Zobacz działa kod na IdeOne.com .
Oto nowoczesna odpowiedź. Kiedy to pytanie zostało zadane w 2011 roku Calendar
iGregorianCalendar
były one powszechnie używane w odniesieniu do dat i godzin, mimo że zawsze były źle zaprojektowane. To jest 8 lat temu, a te zajęcia są już dawno nieaktualne. Zakładając, że nie jesteś jeszcze na poziomie API 26, proponuję użyć biblioteki ThreeTenABP, która zawiera dostosowany do systemu Android backport java.time, nowoczesny interfejs API daty i czasu Java. Praca z java.time jest o wiele przyjemniejsza.
W zależności od Twoich potrzeb i sytuacji istnieją dwie opcje:
Month
i getDisplayName
metoda.DateTimeFormatter
. Locale desiredLanguage = Locale.ENGLISH;
Month m = Month.MAY;
String monthName = m.getDisplayName(TextStyle.FULL, desiredLanguage);
System.out.println(monthName);
Wynik z tego fragmentu kodu to:
Może
W przypadku kilku języków będzie miało znaczenie, czy użyjesz, TextStyle.FULL
czy TextStyle.FULL_STANDALONE
. Będziesz musiał zobaczyć, może sprawdzić u użytkowników, który z nich pasuje do twojego kontekstu.
Jeśli masz randkę z porą dnia lub bez, uważam, że jest DateTimeFormatter
bardziej praktyczny. Na przykład:
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);
Pokazuję użycie ZonedDateTime
, najbliższy zamiennik starej Calendar
klasy. Powyższy kod będzie pracować dla LocalDate
, A LocalDateTime
, MonthDay
, OffsetDateTime
aYearMonth
także.
A jeśli masz Calendar
starsze API, które nie zostało jeszcze zaktualizowane do java.time? Konwertuj na a ZonedDateTime
i postępuj jak powyżej:
Calendar c = getCalendarFromLegacyApi();
ZonedDateTime dateTime = DateTimeUtils.toZonedDateTime(c);
Reszta jest taka sama jak wcześniej.
java.time działa dobrze zarówno na starszych, jak i nowszych urządzeniach z Androidem. Wymaga tylko co najmniej Javy 6 .
org.threeten.bp
z podpakietami.java.time
zostało opisane po raz pierwszy.java.time
Java 6 i 7 (ThreeTen dla JSR-310).Poleciłbym użyć Calendar
obiektu, a Locale
ponieważ nazwy miesięcy są różne dla różnych języków:
// 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);
}
Przykład pełnej nazwy miesiąca:
System.out.println(getMonthName(0, Locale.US, false));
Wynik: January
Przykład krótkiej nazwy miesiąca:
System.out.println(getMonthName(0, Locale.US, true));
Wynik: Jan
Przykładowy sposób, aby uzyskać datę i godzinę w tym formacie „2018 Nov 01 16:18:22”, użyj tego
DateFormat dateFormat = new SimpleDateFormat("yyyy MMM dd HH:mm:ss");
Date date = new Date();
dateFormat.format(date);
Uzyskanie samodzielnej nazwy miesiąca jest zaskakująco trudne do wykonania „prawidłowo” w Javie. (Przynajmniej w chwili pisania tego tekstu. Obecnie używam Java 8).
Problem polega na tym, że w niektórych językach, w tym rosyjskim i czeskim, samodzielna wersja nazwy miesiąca różni się od wersji „formatującej”. Wydaje się również, że żaden pojedynczy interfejs API języka Java nie poda tylko „najlepszego” ciągu. Większość opublikowanych dotychczas odpowiedzi zawiera tylko wersję formatującą. Poniżej wklejono działające rozwiązanie umożliwiające uzyskanie samodzielnej wersji nazwy z jednego miesiąca lub uzyskanie tablicy z wszystkimi z nich.
Mam nadzieję, że zaoszczędzi to trochę czasu komuś innemu!
/**
* 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;
}
Uzyskaj nazwę miesiąca w ciągu znaków.
private String getMonthName() {
Calendar cal = Calendar.getInstance();
SimpleDateFormat month_date = new SimpleDateFormat("MMMM");
String month_name = month_date.format(cal.getTime());
return month_name;
}
Stosowanie:
String monthName = getMonthName();
SimpleDateFormat
klasy i przyjaciół. Sprawdź, czy możesz użyć desugaring lub dodać ThreeTenABP do swojego projektu na Androida, aby używać java.time, nowoczesnego API daty i czasu Java. O wiele przyjemniej się z nim pracuje.