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:
Sử dụng getDisplayName .
Để sử dụng API sớm hơn String.format(Locale.US,"%tB",c);
java.util.Calendarchứ không phải một số Calendarlớp khác , phải không?
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.
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());
Để 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())
"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).
Đơ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
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
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 là Май nhưng không phải Мая
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 mã này chạy trực tiếp tại IdeOne.com .
Đâ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, CalendarvàGregorianCalendar 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:
Monthvà getDisplayNamephương pháp của nó .DateTimeFormatter. 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.
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.
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 .
org.threeten.bpvới các gói con.java.time được mô tả đầu tiên.java.time Java 6 và 7 (ThreeTen cho JSR-310).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
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);
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;
}
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();
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.