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.Calendar
chứ không phải một số Calendar
lớ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 %tb
cho 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.getDisplayName
hoặ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, Calendar
và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:
Month
và getDisplayName
phươ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.FULL
hoặ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 DateTimeFormatter
thự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 Calendar
lớp cũ . Đoạn mã trên sẽ làm việc cho một LocalDate
, một LocalDateTime
, MonthDay
, OffsetDateTime
và một YearMonth
quá.
Điều gì sẽ xảy ra nếu bạn nhận được Calendar
từ một API cũ chưa được nâng cấp lên java.time? Chuyển đổi thành a ZonedDateTime
và 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.bp
vớ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à Locale
vì 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();
SimpleDateFormat
lớ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.