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?
Użyj getDisplayName .
Do wcześniejszego użycia API String.format(Locale.US,"%tB",c);
java.util.Calendar
a nie innejCalendar
klasy, prawda?Formatter f = new Formatter();
(opcjonalnie możesz nadać mu locale) wtedyString 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());
źródło
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())
źródło
„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 rosyjskimLocale
:января (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).
źródło
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
źródło
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
źródło
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 Мая
źródło
Rosyjski.
Month .MAY .getDisplayName( TextStyle.FULL_STANDALONE , new Locale( "ru" , "RU" ) )
Angielski w Stanach Zjednoczonych.
Month .MAY .getDisplayName( TextStyle.FULL_STANDALONE , Locale.US )
Zobacz działa kod na IdeOne.com .
ThreeTenABP i java.time
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
igetDisplayName
metoda.DateTimeFormatter
.Użyj miesiąca
Wynik z tego fragmentu kodu to:
W przypadku kilku języków będzie miało znaczenie, czy użyjesz,
TextStyle.FULL
czyTextStyle.FULL_STANDALONE
. Będziesz musiał zobaczyć, może sprawdzić u użytkowników, który z nich pasuje do twojego kontekstu.Użyj DateTimeFormatter
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 starejCalendar
klasy. Powyższy kod będzie pracować dlaLocalDate
, ALocalDateTime
,MonthDay
,OffsetDateTime
aYearMonth
także.A jeśli masz
Calendar
starsze API, które nie zostało jeszcze zaktualizowane do java.time? Konwertuj na aZonedDateTime
i postępuj jak powyżej:Calendar c = getCalendarFromLegacyApi(); ZonedDateTime dateTime = DateTimeUtils.toZonedDateTime(c);
Reszta jest taka sama jak wcześniej.
Pytanie: Czy java.time nie wymaga interfejsu API Androida na poziomie 26?
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.Spinki do mankietów
java.time
zostało opisane po raz pierwszy.java.time
Java 6 i 7 (ThreeTen dla JSR-310).źródło
Poleciłbym użyć
Calendar
obiektu, aLocale
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
źródło
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);
źródło
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; }
źródło
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();
źródło
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.