Tên tháng dưới dạng một chuỗi


89

Tôi đang cố gắng trả lại tên của tháng dưới dạng Chuỗi, ví dụ: "Tháng 5", "Tháng 9", "Tháng 11".

Tôi đã thử:

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

Tuy nhiên, điều này trả về số nguyên (5, 9, 11, tương ứng). Làm cách nào để lấy tên tháng?

Câu trả lời:


88

Sử dụng getDisplayName .

Để sử dụng API sớm hơn String.format(Locale.US,"%tB",c);


Tôi gặp sự cố: getDisplayName (tháng, Calendar.LONG, Locale.US) Và Eclipse cho tôi biết Calendar.LONG hoặc Calendar.SHORT không tồn tại.
Gaby

Điều đó rất lạ. Bạn đang sử dụng java.util.Calendarchứ không phải một số Calendarlớp khác , phải không?
trutheality

Đúng. Có vẻ như getDisplayName () và Calendar.LONG và Calendar.SHORT được liên kết chỉ là API cấp 9. Vì vậy, nó hoạt động cho cấp 9, nhưng tôi cần cho cấp 7 :(
Gaby

3
Formatter f = new Formatter();(tùy chọn bạn có thể đặt cho nó một ngôn ngữ) sau đó String monthName = f.format("%tB",c).toString();hoặc %tbcho tên viết tắt.
trutheality

5
cũng sử dụng Locale.getDefault () thay vì Locale. Mỹ có thể là một ý tưởng hay :)
Shine

159

Dùng cái này :

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

Tên tháng sẽ chứa tên tháng đầy đủ, nếu bạn muốn tên tháng ngắn thì hãy sử dụng

 SimpleDateFormat month_date = new SimpleDateFormat("MMM");
 String month_name = month_date.format(cal.getTime());

13
"MMMM" sẽ là đủ cho trường hợp đầu tiên.
yanchenko

114

Để nhận tháng trong biến chuỗi, hãy sử dụng mã bên dưới

Ví dụ tháng 9:

M -> 9

MM -> 09

MMM -> Tháng 9

MMMM -> Tháng 9

String monthname=(String)android.text.format.DateFormat.format("MMMM", new Date())

1
vâng, cảm ơn, nó hoạt động như một nét duyên dáng, trong tất cả các ngôn ngữ tôi sử dụng (tiếng Pháp, Anh, Đức)
Chrysotribax

45

"MMMM" chắc chắn KHÔNG phải là giải pháp phù hợp (ngay cả khi nó hoạt động với nhiều ngôn ngữ), hãy sử dụng mẫu "LLLL" với SimpleDateFormat

Hỗ trợ cho 'L' dưới dạng phần mở rộng tương thích với ICU cho các tên tháng độc lập đã được thêm vào nền tảng Android vào tháng 6 năm 2010 .

Ngay cả khi trong tiếng Anh không có sự khác biệt giữa mã hóa bằng 'MMMM' và 'LLLL', bạn cũng nên nghĩ đến các ngôn ngữ khác.

Ví dụ: đây là những gì bạn nhận được, nếu bạn sử dụng Calendar.getDisplayNamehoặc mẫu "MMMM" cho tháng 1 với tiếng NgaLocale :

января (đúng cho một chuỗi ngày hoàn chỉnh: " 10 января, 2014 ")

nhưng trong trường hợp tên tháng độc lập, bạn sẽ mong đợi:

январь

Giải pháp đúng là:

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

Nếu bạn quan tâm đến nguồn gốc của tất cả các bản dịch - đây là tài liệu tham khảo về các bản dịch lịch Gregorian (các lịch khác được liên kết trên đầu trang).


'LLLL' chỉ có sẵn kể từ Java 8, bạn có thể sử dụng 'MMMM' với SimpleDateFormat và nó hoạt động hoàn toàn tốt cho phiên bản độc lập.
juanheyns

23

Đơn giản như thế này

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

Calendar.LONG là để lấy tên đầy đủ của tháng và Calendar.SHORT cung cấp tên ngắn gọn. Ví dụ: Calendar.LONG sẽ trả về Lịch tháng Giêng. HORT sẽ trả về Tháng Giêng


Câu trả lời chính xác. Tôi đang tự đặt lịch để báo thức và cần lấy tên tháng sau đó. Câu trả lời hoàn hảo. Cảm ơn bạn
Ajji

10

Tôi giữ câu trả lời này hữu ích cho các trường hợp khác, nhưng câu trả lời @trutheality dường như là cách đơn giản và trực tiếp nhất.

Bạn có thể sử dụng DateFormatSymbols

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

5

Cách duy nhất trên Android để có được tên tháng stanalone được định dạng đúng cho các ngôn ngữ như ukrainian, nga, czech

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

Đã thử nghiệm trên API 15-25

Đầu ra cho tháng 5Май nhưng không phải Мая


3

Tiếng Nga.

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

май

Tiếng Anh ở Hoa Kỳ.

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

có thể

Xem này chạy trực tiếp tại IdeOne.com .

ThreeTenABP và java.time

Đây là câu trả lời hiện đại. Khi câu hỏi này được hỏi vào năm 2011, CalendarGregorianCalendar thường được sử dụng cho ngày và giờ mặc dù chúng luôn được thiết kế kém. Bây giờ là 8 năm trước, và những lớp học đó đã lỗi thời từ lâu. Giả sử bạn chưa ở cấp API 26, đề xuất của tôi là sử dụng thư viện ThreeTenABP, chứa một cổng lùi java.time được điều chỉnh cho Android, API ngày và giờ Java hiện đại. java.time tốt hơn rất nhiều để làm việc với.

Tùy thuộc vào nhu cầu và tình hình chính xác của bạn, có hai lựa chọn:

  1. Sử dụng MonthgetDisplayNamephương pháp của nó .
  2. Sử dụng a DateTimeFormatter.

Tháng sử dụng

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

Đầu ra từ đoạn mã này là:

có thể

Trong một số ngôn ngữ, nó sẽ tạo ra sự khác biệt cho dù bạn sử dụng TextStyle.FULLhoặc TextStyle.FULL_STANDALONE. Bạn sẽ phải xem, có thể kiểm tra với người dùng của mình, cái nào trong hai cái này phù hợp với ngữ cảnh của bạn.

Sử dụng DateTimeFormatter

Nếu bạn có một cuộc hẹn có hoặc không có thời gian trong ngày, tôi thấy một cuộc hẹn DateTimeFormatterthực tế hơn. Ví dụ:

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

Tôi đang cho thấy việc sử dụng a ZonedDateTime, sự thay thế gần nhất cho Calendarlớp cũ . Đoạn mã trên sẽ làm việc cho một LocalDate, một LocalDateTime, MonthDay, OffsetDateTimevà một YearMonthquá.

Điều gì sẽ xảy ra nếu bạn nhận được Calendartừ một API cũ chưa được nâng cấp lên java.time? Chuyển đổi thành a ZonedDateTimevà tiến hành như trên:

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

Phần còn lại giống như trước.

Câu hỏi: java.time không yêu cầu Android API cấp 26?

java.time hoạt động tốt trên cả thiết bị Android cũ hơn và mới hơn. Nó chỉ yêu cầu ít nhất Java 6 .

  • Trong Java 8 trở lên và trên các thiết bị Android mới hơn (từ API cấp 26), API hiện đại được tích hợp sẵn.
  • Trong Java 6 và 7 không phải Android, hãy tải Cổng nền ThreeTen, cổng nền của các lớp hiện đại (ThreeTen cho JSR 310; xem các liên kết ở dưới cùng).
  • Trên Android (cũ hơn) sử dụng phiên bản Android của ThreeTen Backport. Nó được gọi là ThreeTenABP. Và đảm bảo rằng bạn nhập các lớp ngày và giờ từ org.threeten.bpvới các gói con.

Liên kết


2

Tôi khuyên bạn nên sử dụng Calendarđối tượng và Localevì tên tháng khác nhau cho các ngôn ngữ khác nhau:

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

Ví dụ cho tên tháng đầy đủ:

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

Kết quả: January

Ví dụ cho tên tháng ngắn:

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

Kết quả: Jan


2

Một cách mẫu để lấy ngày và giờ ở định dạng "2018 Nov 01 16:18:22" sử dụng

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

0

Lấy một tên tháng độc lập rất khó để thực hiện "đúng" trong Java. (Ít nhất là khi viết bài này. Tôi hiện đang sử dụng Java 8).

Vấn đề là ở một số ngôn ngữ, bao gồm cả tiếng Nga và tiếng Séc, phiên bản độc lập của tên tháng khác với phiên bản "định dạng". Ngoài ra, có vẻ như không có API Java nào chỉ cung cấp cho bạn chuỗi "tốt nhất". Phần lớn các câu trả lời được đăng ở đây cho đến nay chỉ cung cấp phiên bản định dạng. Dán bên dưới là một giải pháp hiệu quả để nhận phiên bản độc lập của một tên tháng hoặc nhận một mảng có tất cả chúng.

Tôi hy vọng điều này sẽ tiết kiệm thời gian cho người khác!

/**
 * 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

Lấy tên của tháng trong Chuỗi.

 private String getMonthName() {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat month_date = new SimpleDateFormat("MMMM");
    String month_name = month_date.format(cal.getTime());
    return month_name;
}

Sử dụng:

String monthName = getMonthName();

Cân nhắc không sử dụng SimpleDateFormatlớp học và bạn bè đã lỗi thời và khét tiếng lâu đời . Xem liệu bạn có thể sử dụng gỡ cài đặt hoặc thêm ThreeTenABP vào dự án Android của mình hay không, để sử dụng java.time, API ngày và giờ Java hiện đại. Nó là rất nhiều tốt hơn để làm việc với.
Ole VV

Bạn có đang đóng góp nhiều điều chưa có trong câu trả lời được bình chọn nhiều nhất bởi John không?
Ole VV
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.