Nazwa miesiąca jako ciąg


89

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:


88

Użyj getDisplayName .

Do wcześniejszego użycia API String.format(Locale.US,"%tB",c);


Mam problem: getDisplayName (month, Calendar.LONG, Locale.US) i Eclipse mówi mi, że Calendar.LONG lub Calendar.SHORT nie istnieją.
Gaby

To bardzo dziwne. Używasz, java.util.Calendara nie innej Calendarklasy, prawda?
prawdomówność

tak. Wygląda na to, że getDisplayName () i skojarzone z nim Calendar.LONG i Calendar.SHORT są tylko na poziomie API 9. Więc to działa na poziomie 9, ale potrzebuję na poziom 7 :(
Gaby

3
Formatter f = new Formatter();(opcjonalnie możesz nadać mu locale) wtedy String monthName = f.format("%tB",c).toString();lub %tbdla krótkiej nazwy.
prawdomówność

5
również użycie Locale.getDefault () zamiast Locale.US może być dobrym pomysłem :)
Shine

159

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());

13
W pierwszym przypadku wystarczyłoby „MMMM”.
yanchenko

115

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())

1
tak, dzięki, działa jak urok, we wszystkich językach, których używam (francuski, angielski, niemiecki)
Chrysotribax

45

„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.getDisplayNamewzoru 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).


„LLLL” jest dostępny tylko od wersji Java 8, można używać „MMMM” z SimpleDateFormat i działa również doskonale w wersji samodzielnej.
juanheyns

dla jasności, w języku rosyjskim tłumaczenie „Января” to dopełniacz, oznaczający „stycznia”, podczas gdy „Январь” jest mianownikiem, czyli po prostu „stycznia”. mogą istnieć inne języki słowiańskie z tym rozróżnieniem, takie jak ukraiński i serbski. Jest to po prostu gramatyczne i zwykle niezbyt ważne. Ale przypadki użycia podane w tej odpowiedzi są poprawne gramatycznie: użyj MMMM dla pełnych dat i LLLL podczas wyświetlania samego miesiąca, jeśli chcesz być jak najbardziej poprawny.
ser księżycowy

23

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


Świetna odpowiedź. Sam ustawiałem kalendarz na alarm i potrzebowałem później ustalić nazwę miesiąca. Doskonała odpowiedź. Dziękuję
Ajji

10

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

5

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 Мая


3

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 .

ThreeTenABP i java.time

Oto nowoczesna odpowiedź. Kiedy to pytanie zostało zadane w 2011 roku CalendariGregorianCalendar 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:

  1. Zastosowanie Monthi getDisplayNamemetoda.
  2. Użyj DateTimeFormatter.

Użyj miesiąca

    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.FULLczy TextStyle.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 DateTimeFormatterbardziej 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 Calendarklasy. Powyższy kod będzie pracować dla LocalDate, A LocalDateTime, MonthDay, OffsetDateTimeaYearMonth także.

A jeśli masz Calendarstarsze API, które nie zostało jeszcze zaktualizowane do java.time? Konwertuj na a ZonedDateTimei 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 .

  • W Javie 8 i nowszych oraz na nowszych urządzeniach z Androidem (od poziomu API 26) wbudowane jest nowoczesne API.
  • W wersjach Java 6 i 7 innych niż Android pobierz ThreeTen Backport, zaplecze nowoczesnych klas (ThreeTen dla JSR 310; zobacz linki na dole).
  • Na (starszym) systemie Android użyj wersji ThreeTen Backport na Androida. Nazywa się ThreeTenABP. I upewnij się, że importujesz klasy daty i czasu org.threeten.bpz podpakietami.

Spinki do mankietów


2

Poleciłbym użyć Calendarobiektu, a Localeponieważ 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


2

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);

0

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;
}

0

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();

Rozważ nie skorzystanie z przestarzałej i notorycznie kłopotliwej SimpleDateFormatklasy 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.
Ole VV

Czy wnosisz dużo rzeczy, które nie znajdują się już w najczęściej głosowanej odpowiedzi Johna?
Ole VV
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.