Cách lấy tên tháng từ Lịch


Câu trả lời:


99

Bạn cũng sẽ nhận được theo cách này.

  String getMonthForInt(int num) {
        String month = "wrong";
        DateFormatSymbols dfs = new DateFormatSymbols();
        String[] months = dfs.getMonths();
        if (num >= 0 && num <= 11 ) {
            month = months[num];
        }
        return month;
    }

6
DateFormatSymbols thực hiện được thay đổi trong JDK 8, vì vậy phương pháp getMonths không trả lại giá trị đúng cho tất cả của Locale nữa: oracle.com/technetwork/java/javase/...
ahaaman

1
bạn có thể đưa ra giải pháp thay thế / giải pháp làm việc cho JDK8 không?
Dominik

khi nào bạn nhận được một tháng dưới dạng một con số?
Mickey Perlstein

Mickey để trả lời câu hỏi của bạn, đây là cách bạn lấy tháng dưới dạng int và sử dụng nó - public static void main (String [] args) {int month; GregorianCalendar date = mới GregorianCalendar (); tháng = date.get (Calendar.MONTH); System.out.println ("Tháng hiện tại là" + (tháng + 1) + "và Tên tháng là" + getMonthForInt (tháng)); } static String getMonthForInt (int num) {Chuỗi tháng = "sai"; DateFormatSymbols dfs = new DateFormatSymbols (); String [] tháng = dfs.getMonths (); if (num> = 0 && num <= 11) {month = months [num]; } tháng trở lại; }
Ajay Kumar

192

bạn có thể đạt được nó bằng cách sử dụng SimpleDateFormat , có nghĩa là để định dạng ngày và giờ.

Calendar cal = Calendar.getInstance();
System.out.println(new SimpleDateFormat("MMM").format(cal.getTime()));

Điều này sẽ hoạt động nhưng tôi muốn lấy đại diện chuỗi. của tháng khi tôi biết chỉ số của nó. Tôi nghĩ tôi sẽ sử dụng các cách tiếp cận khác, cảm ơn.
ogzd

47
điều này đã giúp tôi có được tên tháng hiện tại. mặc dù tôi đã sử dụng ("MMMM") để lấy tên tháng đầy đủ thay vì tên rút gọn.
speedynomads

77

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

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

4
Theo tôi, việc sử dụng tính trừu tượng của Lịch là giải pháp thanh lịch nhất. +1
sebastian

2
Sai lầm! Vấn đề sẽ nằm trong các ngôn ngữ với các trường hợp. Ví dụ: trong ngôn ngữ Slav, nó sẽ trả về tháng trong trường hợp gen, ví dụ: đối với tháng 10 trong ngôn ngữ ru-RU, bạn sẽ nhận được октябряthay vì Октябрь, bạn có thể mong đợi.
Nick Sikrier

41

Đây là giải pháp tôi đưa ra cho một dự án lớp:

public static String theMonth(int month){
    String[] monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
    return monthNames[month];
}

Số bạn chuyển đến đến từ một Calendar.MONTHcuộc gọi.


2
Đây là hữu ích cho tôinew SimpleDateFormat("MMMM").format(cal.getTime());
Pratik Butani

đây là một giải pháp yếu, làm thế nào về tháng một, tháng hai vv không Ngoài Tháng Một Tháng Hai vv này sẽ không bao gồm tất cả các tình huống
Abeer zaroor

2
Tốt, bạn nên thêm 1 vào tháng. Mảng bắt đầu từ 0.
RoccoDev

điều này thật tệ, bạn đang phát minh lại java?
Mickey Perlstein

1
Điều này hoạt động cho người dùng nói tiếng Anh. Còn những người khác?
Advait S

33

nếu bạn có giao diện đa ngôn ngữ, bạn có thể sử dụng getDisplayName để hiển thị tên của tháng với quyền kiểm soát ngôn ngữ hiển thị.

đây là một ví dụ về hiển thị tên tháng bằng tiếng Anh, frensh, tiếng Ả Rập và tiếng Ả Rập ở quốc gia cụ thể như "Syria":

    Calendar c = Calendar.getInstance();
    System.out.println(c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH ) );
    System.out.println(c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.FRANCE ) );
    System.out.println(c.getDisplayName(Calendar.MONTH, Calendar.LONG, new Locale("ar") ) );
    System.out.println(c.getDisplayName(Calendar.MONTH, Calendar.LONG, new Locale("ar", "SY") ) );
    System.out.println(c.getTime().toString());

kết quả là:

  January
  janvier
  يناير
  كانون الثاني
  Sat Jan 17 19:31:30 EET 2015

Đây là phiên bản java nào?
Muhammad Gelbana

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

Đối với một số ngôn ngữ (ví dụ: tiếng Nga), đây là cách chính xác duy nhất để lấy tên tháng độc lập.

Đây là những gì bạn nhận được, nếu bạn sử dụng getDisplayNametừ Calendarhoặc DateFormatSymbolstrong tháng 1:

января (đú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:

январь


Là một câu trả lời chính xác cho ngôn ngữ RU. Rất kỳ lạ, SDK android đó không chứa thông số kỹ thuật 'LLLL'.
Anfet

12

Joda-Time

Làm thế nào về việc sử dụng Joda-Time . Đó là một API ngày-giờ tốt hơn nhiều để làm việc (Và Januarycó nghĩa là tháng Giêng ở đây. Nó không giống như Lịch, sử dụng 0-basedchỉ mục trong nhiều tháng).

Bạn có thể sử dụng AbstractDateTime#toString( pattern )phương pháp để định dạng ngày ở định dạng được chỉ định:

DateTime date = DateTime.now();
String month = date.toString("MMM");

Tên tháng từ số

Nếu bạn muốn đặt tên tháng cho một số tháng cụ thể, bạn có thể thực hiện như sau:

int month = 3;
String monthName = DateTime.now().withMonthOfYear(month).toString("MMM");

Bản địa hóa

Phương pháp trên sử dụng Ngôn ngữ mặc định hiện tại của JVM của bạn cho ngôn ngữ của tên tháng. Thay vào đó, bạn muốn chỉ định một đối tượng Locale.

String month = date.toString( "MMM", Locale.CANADA_FRENCH );

1
cảm ơn nhưng tôi hài lòng với cái cũ của mình SimpleDateFormatDate
ogzd 12/02/13

@ogzd. Mong muốn của bạn. Nhưng chắc chắn bạn nên thử, và tôi cá là bạn sẽ thích hát nó.
Rohit Jain

@ogzd. Tôi đăng cách lấy tên tháng từ số tháng. BTW, tại sao bạn muốn làm điều đó?
Rohit Jain

10

Month::getDisplayName

Kể từ Java 8, hãy sử dụng Monthenum. Các getDisplayNamephương pháp tự động localizes tên của tháng.

Vượt qua:

  • A TextStyleđể xác định độ dài hoặc cách viết tắt.
  • A Localeđể chỉ định ngôn ngữ con người được sử dụng trong bản dịch và các quy tắc văn hóa được sử dụng để viết tắt, dấu câu, v.v.

Thí dụ:

public static String getMonthStandaloneName(Month month) {
    return month.getDisplayName(
        TextStyle.FULL_STANDALONE, 
        Locale.getDefault()
    );
}

9

Đó có thể là một câu hỏi cũ, nhưng để lấy tên của tháng khi chúng ta biết các chỉ số, tôi đã sử dụng

String month = new DateFormatSymbols().getMonths()[monthNumber - 1];

hoặc cho những cái tên ngắn gọn

String month = new DateFormatSymbols().getShortMonths()[monthNumber - 1];

Xin lưu ý rằng bạn monthNumberbắt đầu đếm từ 1 trong khi bất kỳ phương thức nào ở trên trả về một mảng, vì vậy bạn cần bắt đầu đếm từ 0.


3

Mã này có hỗ trợ ngôn ngữ. Tôi đã sử dụng chúng trong Ứng dụng Android.

String[] mons = new DateFormatSymbols().getShortMonths();//Jan,Feb,Mar,... 

String[] months = new DateFormatSymbols().getMonths();//January,Februaty,March,...

1
Đây hoạt động hoàn hảo, các ý kiến chỉ là một chút nhỏ bé hoàn toàn sai mặc dù
Иво Недев

3

Tôi thấy điều này dễ dàng hơn nhiều ( https://docs.oracle.com/javase/tutorial/datetime/iso/enum.html )

private void getCalendarMonth(Date date) {      
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    Month month = Month.of(calendar.get(Calendar.MONTH));       
    Locale locale = Locale.getDefault();
    System.out.println(month.getDisplayName(TextStyle.FULL, locale));
    System.out.println(month.getDisplayName(TextStyle.NARROW, locale));
    System.out.println(month.getDisplayName(TextStyle.SHORT, locale));
}

không Monthbắt đầu chỉ mục của nó với January = 1, trong khi Lịch bắt đầu với January = 0? Sẽ không Month.of(calendar.get(Calendar.MONTH));thất bại trong trường hợp của tháng Giêng?
MCO

2

Bạn có thể lấy nó một dòng như thế này: String monthName = new DataFormatSymbols.getMonths()[cal.get(Calendar.MONTH)]


2

Điều này phù hợp với tôi:

String getMonthName(int monthNumber) {
    String[] months = new DateFormatSymbols().getMonths();
    int n = monthNumber-1;
    return (n >= 0 && n <= 11) ? months[n] : "wrong number";
}

Để trả về "September"với một dòng:

String month = getMonthName(9);

2

Một chiều:

Chúng tôi có MonthAPI trong Java ( java.time.Month). Chúng ta có thể nhận được bằng cách sử dụngMonth.of(month);

Ở đây, Monthchúng được lập chỉ mục dưới dạng số để bạn có thể cung cấp Month.JANUARYhoặc cung cấp chỉ mục trong API ở trên, chẳng hạn như 1, 2, 3, 4.

Cách thứ hai:

ZonedDateTime.now().getMonth();

Điều này có sẵn trong java.time.ZonedDateTime.


1

Tôi đã tạo một tiện ích mở rộng kotlin dựa trên các câu trả lời trong chủ đề này và sử dụng câu trả lời DateFormatSymbols, bạn sẽ nhận được phản hồi được bản địa hóa.

fun Date.toCalendar(): Calendar {
    val calendar = Calendar.getInstance()
    calendar.time = this
    return calendar
}


fun Date.getMonthName(): String {
    val month = toCalendar()[Calendar.MONTH]
    val dfs = DateFormatSymbols()
    val months = dfs.months
    return months[month]
}

1

Điều này đã làm việc cho tôi

        import java.text.SimpleDateFormat;
        import java.util.Calendar;


        Calendar cal = Calendar.getInstance();
        String currentdate=new SimpleDateFormat("dd-MMM").format(cal.getTime());

0
DateFormat date =  new SimpleDateFormat("dd/MMM/yyyy");
Date date1 = new Date();
System.out.println(date.format(date1));

1
Mặc dù câu trả lời của bạn có thể đúng, nhưng nó có chất lượng không tốt. Vui lòng giải thích tại sao câu trả lời này là đúng.
SubliemeSiem

1
@SubliemeSiem Tôi chỉ đang cố gắng thay đổi định dạng và cách đơn giản nhất để thực hiện nó: MM- nó sẽ trả về tên tháng ở dạng số nguyên như 01, 02, 03. MMM-nó sẽ trả về tên tháng ngắn gọn như jan, feb, mar. MMMM-nó sẽ trả về tên tháng đầy đủ ở định dạng chuỗi như tháng Giêng.
Amit Mishra

đây là câu trả lời ĐÚNG duy nhất cho việc định dạng ngày tháng. sử dụng đối tượng Ngày hoặc Lịch và định dạng nó bằng một trình định dạng. câu hỏi chính nó là BAD
Mickey Perlstein

0

Nó trả về tên tiếng Anh của tháng. 04 trả về THÁNG 4 và như vậy.

String englishMonth (int month){
        return Month.of(month);
    }

Đề nghị đơn giản và trực tiếp, cảm ơn. Mã của bạn không biên dịch. Bạn sẽ phải khai báo kiểu trả về Monthhoặc áp dụng toStringcho kết quả trước khi trả về.
Ole VV

-3

từ tài liệu java SimpleDateFormat:

*         <td><code>"yyyyy.MMMMM.dd GGG hh:mm aaa"</code>
 *         <td><code>02001.July.04 AD 12:08 PM</code>
 *         <td><code>"EEE, d MMM yyyy HH:mm:ss Z"</code>
 *         <td><code>Wed, 4 Jul 2001 12:08:56 -0700</code>

Tôi không thể hiểu câu trả lời cho câu hỏi này như thế nào.
jhpg
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.