Nama bulan sebagai string

90

Saya mencoba mengembalikan nama bulan sebagai String, misalnya "Mei", "September", "November".

Saya mencoba:

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

Namun, ini mengembalikan bilangan bulat (5, 9, 11, masing-masing). Bagaimana saya bisa mendapatkan nama bulan?

Orang bodoh
sumber

Jawaban:

88

Gunakan getDisplayName .

Untuk penggunaan API sebelumnya String.format(Locale.US,"%tB",c);

kebenaran
sumber
Saya mendapat masalah: getDisplayName (bulan, Calendar.LONG, Locale.US) Dan Eclipse memberi tahu saya Calendar.LONG atau Calendar.SHORT tidak ada.
Gaby
Aneh sekali. Anda menggunakan java.util.Calendardan bukan Calendarkelas lain , kan?
trutheality
Iya. Sepertinya getDisplayName () dan Calendar.LONG serta Calendar.SHORT terkait hanya API level 9. Jadi, ini berfungsi untuk level 9, tetapi saya perlu untuk level 7 :(
Gaby
3
Formatter f = new Formatter();(opsional Anda dapat memberikannya lokal) lalu String monthName = f.format("%tB",c).toString();atau %tbuntuk nama pendek.
trutheality
5
juga menggunakan Locale.getDefault () daripada Locale.US bisa menjadi ide yang bagus :)
Bersinar
163

Gunakan ini :

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

Nama bulan akan berisi nama bulan lengkap ,, jika Anda ingin nama bulan pendek gunakan ini

 SimpleDateFormat month_date = new SimpleDateFormat("MMM");
 String month_name = month_date.format(cal.getTime());
John
sumber
13
"MMMM" sudah cukup untuk kasus pertama.
yanchenko
119

Untuk mendapatkan bulan dalam variabel string gunakan kode di bawah ini

Misalnya bulan September:

M -> 9

MM -> 09

MMM -> Sep

MMMM -> September

String monthname=(String)android.text.format.DateFormat.format("MMMM", new Date())
Arun Antoney
sumber
1
ya, terima kasih, ini berfungsi seperti pesona, dalam semua bahasa yang saya gunakan (Prancis, Inggris, Jerman)
Chrysotribax
46

"MMMM" jelas BUKAN solusi yang tepat (meskipun berfungsi untuk banyak bahasa), gunakan pola "LLLL" dengan SimpleDateFormat

Dukungan untuk 'L' sebagai ekstensi yang kompatibel dengan ICU untuk nama bulan yang berdiri sendiri telah ditambahkan ke platform Android pada Juni 2010 .

Meskipun dalam bahasa Inggris tidak ada perbedaan antara pengkodean oleh 'MMMM' dan 'LLLL', Anda harus memikirkan bahasa lain juga.

Misalnya, inilah yang Anda dapatkan, jika Anda menggunakan Calendar.getDisplayNameatau pola "MMMM" untuk bulan Januari dengan bahasa Rusia Locale:

января (yang benar untuk string tanggal lengkap: " 10 января, 2014 ")

tetapi dalam kasus nama bulan yang berdiri sendiri, Anda akan mengharapkan:

январь

Solusi yang tepat adalah:

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

Jika Anda tertarik dari mana asal semua terjemahan - berikut adalah referensi untuk terjemahan kalender masehi (kalender lain ditautkan di atas halaman).

artkoenig.dll
sumber
1
'LLLL' hanya tersedia sejak Java 8, Anda dapat menggunakan 'MMMM' dengan SimpleDateFormat dan berfungsi dengan baik untuk versi mandiri juga.
juanheyns
agar jelas, dalam bahasa Rusia terjemahan dari "Января" adalah genitive case, yang berarti "of January" sedangkan "Январь" adalah nominative, artinya hanya "January". mungkin ada bahasa Slavia lain dengan perbedaan ini seperti bahasa Ukraina dan Serbia. Itu hanya tata bahasa dan biasanya tidak terlalu penting. Tetapi kasus penggunaan yang diberikan dalam jawaban ini secara gramatikal benar: gunakan MMMM untuk tanggal lengkap dan BMPK saat menampilkan bulannya sendiri jika Anda ingin benar.
moonlightcheese
terima kasih, saya berjuang dengan kasus bahasa Rusia :)
BekaBot
26

Sesederhana ini

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

Calendar.LONG adalah untuk mendapatkan nama lengkap bulan dan Calendar.SHORT memberikan nama singkatnya. Misalnya: Calendar.LONG akan mengembalikan January Calendar.SHORT akan mengembalikan Jan

sandalone
sumber
Jawaban yang bagus. Saya sedang mengatur kalender sendiri untuk alarm dan perlu mendapatkan nama bulan nanti.
Jawaban
10

Saya menyimpan jawaban ini yang berguna untuk kasus lain, tetapi jawaban @trutheality tampaknya merupakan cara yang paling sederhana dan langsung.

Anda dapat menggunakan DateFormatSymbols

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

Satu-satunya cara di Android untuk mendapatkan nama bulan stanalone yang diformat dengan benar untuk bahasa seperti ukraina, rusia, ceko

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

Diuji pada API 15-25

Output untuk Mei adalah Май tapi tidak Мая

Dmytro
sumber
3

Rusia.

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

май

Bahasa Inggris di Amerika Serikat.

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

Mungkin

Lihat kode ini ditayangkan langsung di IdeOne.com .

ThreeTenABP dan java.time

Inilah jawaban modernnya. Ketika pertanyaan ini diajukan pada tahun 2011, Calendardan GregorianCalendarbiasanya digunakan untuk tanggal dan waktu meskipun desainnya selalu buruk. Itu 8 tahun yang lalu sekarang, dan kelas-kelas itu sudah lama ketinggalan zaman. Dengan asumsi Anda belum menggunakan API level 26, saran saya adalah menggunakan pustaka ThreeTenABP, yang berisi backport java.time yang diadaptasi Android, API tanggal dan waktu Java modern. java.time jauh lebih baik untuk dikerjakan.

Bergantung pada kebutuhan dan situasi Anda, ada dua opsi:

  1. Penggunaan Monthdan getDisplayNamemetodenya.
  2. Gunakan a DateTimeFormatter.

Gunakan Bulan

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

Keluaran dari potongan ini adalah:

Mungkin

Dalam beberapa bahasa, akan membuat perbedaan apakah Anda menggunakan TextStyle.FULLatau TextStyle.FULL_STANDALONE. Anda harus melihat, mungkin memeriksa dengan pengguna Anda, mana dari keduanya yang cocok dengan konteks Anda.

Gunakan DateTimeFormatter

Jika Anda punya kencan dengan atau tanpa waktu, menurut saya cara yang DateTimeFormatterlebih praktis. Sebagai contoh:

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

Saya menunjukkan penggunaan a ZonedDateTime, pengganti terdekat untuk Calendarkelas lama . Kode di atas akan bekerja untuk LocalDate, sebuah LocalDateTime, MonthDay, OffsetDateTimedan YearMonthjuga.

Bagaimana jika Anda mendapatkan Calendardari API lama yang belum diupgrade ke java.time? Ubah menjadi a ZonedDateTimedan lanjutkan seperti di atas:

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

Sisanya sama seperti sebelumnya.

Pertanyaan: Bukankah java.time memerlukan Android API level 26?

java.time bekerja dengan baik di perangkat Android lama dan lebih baru. Ini hanya membutuhkan setidaknya Java 6 .

  • Di Java 8 dan yang lebih baru dan pada perangkat Android yang lebih baru (dari API level 26), API modern sudah ada di dalamnya.
  • Di non-Android Java 6 dan 7 dapatkan ThreeTen Backport, backport kelas modern (ThreeTen untuk JSR 310; lihat link di bagian bawah).
  • Di Android (lebih lama), gunakan ThreeTen Backport edisi Android. Ini disebut ThreeTenABP. Dan pastikan Anda mengimpor kelas tanggal dan waktu dari org.threeten.bpdengan subpaket.

Tautan

Ole VV
sumber
2

Saya akan merekomendasikan untuk menggunakan Calendarobjek dan Localekarena nama bulan berbeda untuk bahasa yang berbeda:

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

Contoh nama bulan penuh:

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

Hasil: January

Contoh nama bulan pendek:

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

Hasil: Jan

Ayaz Alifov
sumber
2

Contoh cara untuk mendapatkan tanggal dan waktu dalam format ini "01 Nov 2018 16:18:22" gunakan ini

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

Mendapatkan nama bulan yang berdiri sendiri ternyata sulit dilakukan dengan "benar" di Java. (Setidaknya saat tulisan ini dibuat. Saat ini saya menggunakan Java 8).

Masalahnya adalah bahwa dalam beberapa bahasa, termasuk Rusia dan Ceko, versi nama bulan yang berdiri sendiri berbeda dari versi "pemformatan". Selain itu, tampaknya tidak ada satu Java API yang akan memberi Anda string "terbaik". Mayoritas jawaban yang diposting di sini sejauh ini hanya menawarkan versi format. Disisipkan di bawah ini adalah solusi yang berfungsi untuk mendapatkan versi mandiri dari satu nama bulan, atau mendapatkan array dengan semuanya.

Saya harap ini menghemat waktu orang lain!

/**
 * 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;
}
BlakeTNC
sumber