จะรับชื่อเดือนจากปฏิทินได้อย่างไร?


97

มี oneliner เพื่อรับชื่อเดือนเมื่อเรารู้หรือไม่

int monthNumber = calendar.get(Calendar.MONTH)

หรือวิธีไหนง่ายที่สุด?


3
@anyone_reaching_this_issue: คำถามนี้ ( stackoverflow.com/questions/6192781/month-name-as-a-string ) กล่าวถึง getDisplayName () และเทคนิค intesreting อื่น ๆ
Poutrathor

คำตอบ:


101

คุณจะได้รับวิธีนี้ด้วย

  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 มีการเปลี่ยนแปลงใน JDK 8 ดังนั้นเมธอด getMonths จึงไม่ส่งคืนค่าที่ถูกต้องสำหรับ Locale ทั้งหมดอีกต่อไป: oracle.com/technetwork/java/javase/…
ahaaman

1
คุณช่วยแก้ปัญหาเบื้องต้น / วิธีแก้ปัญหาสำหรับ JDK8 ได้ไหม
Dominik

คุณจะได้รับเดือนเป็นตัวเลขเมื่อใด
Mickey Perlstein

มิกกี้ตอบคำถามของคุณนี่คือวิธีที่คุณได้รับเดือนเป็น int และใช้มัน - public static void main (String [] args) {int month; GregorianCalendar วันที่ = GregorianCalendar ใหม่ (); เดือน = date.get (Calendar.MONTH); System.out.println ("เดือนปัจจุบันคือ" + (เดือน + 1) + "และชื่อเดือนคือ" + getMonthForInt (เดือน)); } สตริงคง getMonthForInt (int num) {String month = "ผิด"; DateFormatSymbols dfs = DateFormatSymbols ใหม่ (); สตริง [] เดือน = dfs.getMonths (); ถ้า (num> = 0 && num <= 11) {month = months [num]; } คืนเดือน; }
Ajay Kumar

194

คุณสามารถทำได้โดยใช้SimpleDateFormatซึ่งมีไว้เพื่อจัดรูปแบบวันที่และเวลา

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

สิ่งนี้จะใช้งานได้ แต่ฉันต้องการรับสตริง repr ของเดือนเมื่อฉันรู้ดัชนีของมัน ฉันคิดว่าฉันจะใช้วิธีอื่นขอบคุณ
ogzd

48
สิ่งนี้ช่วยให้ฉันได้ชื่อเดือนปัจจุบัน แม้ว่าฉันจะใช้ ("MMMM") เพื่อรับชื่อเต็มเดือนแทนที่จะเป็นชื่อย่อ
speedynomads

79

ง่ายๆเพียงเท่านี้

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

4
การใช้สิ่งที่เป็นนามธรรมของปฏิทินเป็นวิธีที่ดีที่สุดในความคิดของฉัน +1
เซบาสเตียน

2
ไม่ถูกต้อง! ปัญหาจะเป็นภาษาที่มีเคส ตัวอย่างเช่นในภาษาสลาฟจะส่งคืนเดือนในกรณีสัมพันธการกตัวอย่างเช่นสำหรับเดือนตุลาคมในภาษา ru-RU ที่คุณจะได้รับоктябряแทนОктябрьซึ่งคุณอาจคาดหวัง
Nick Sikrier

41

นี่คือวิธีแก้ปัญหาที่ฉันคิดขึ้นสำหรับโครงการชั้นเรียน:

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

หมายเลขที่คุณส่งผ่านมาจากการCalendar.MONTHโทร


2
สิ่งนี้มีประโยชน์สำหรับฉันnew SimpleDateFormat("MMMM").format(cal.getTime());
Pratik Butani

นี่เป็นวิธีการแก้ปัญหาที่อ่อนแอเป็นอย่างไรเมื่อวันจันทร์กุมภาพันธ์ ฯลฯ ไม่ใช่เดือนมกราคมเป็นต้นไปสิ่งนี้จะไม่ครอบคลุมสถานการณ์ทั้งหมด
Abeer zaroor

2
คุณควรเพิ่ม 1 ในเดือน อาร์เรย์เริ่มตั้งแต่ 0.
RoccoDev

1
ใช้ได้กับผู้ใช้ที่พูดภาษาอังกฤษ แล้วคนอื่น ๆ ล่ะ?
Advait S

1
@MickeyPerlstein ไม่นั่นไม่ใช่ 'นวัตกรรมใหม่' (อย่างที่คุณใส่ไว้) Java และก็ไม่ได้ 'แย่' เช่นกัน นั่นเป็นวิธีการง่ายๆ นอกจากนี้ยังขึ้นอยู่กับการไม่ต้องใช้คลาสปฏิทิน (หรืออย่างน้อยคุณก็ไม่ต้องใช้ - แม้ว่าคุณจะต้องการเดือนปัจจุบันก็ตาม) ซึ่งอาจเป็นที่ต้องการในบางกรณี แน่นอนว่าเป็นภาษาอังกฤษเท่านั้น แต่นั่นก็นอกเหนือจากประเด็น
Pryftan

33

หากคุณมีอินเทอร์เฟซหลายภาษาคุณสามารถใช้ getDisplayName เพื่อแสดงชื่อเดือนด้วยการควบคุมภาษาที่แสดง

นี่คือตัวอย่างของการแสดงชื่อเดือนในภาษาอังกฤษเฟรนช์อารบิกและอารบิกในบางประเทศเช่น "ซีเรีย":

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

ผลลัพธ์คือ:

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

จาวารุ่นนี้คือรุ่นใด
Muhammad Gelbana

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

สำหรับบางภาษา (เช่นรัสเซีย) นี่เป็นวิธีเดียวที่ถูกต้องในการรับชื่อเดือนแบบสแตนด์อะโลน

นี่คือสิ่งที่คุณจะได้รับหากคุณใช้getDisplayNameตั้งแต่เดือนมกราคมCalendarหรือDateFormatSymbolsในเดือนมกราคม:

января (ซึ่งถูกต้องสำหรับสตริงวันที่ที่สมบูรณ์: " 10 января, 2014 ")

แต่ในกรณีของชื่อเดือนแบบสแตนด์อะโลนคุณจะคาดหวัง:

январь


เป็นคำตอบที่ถูกต้องสำหรับภาษา RU แปลกมากที่ Android SDK ไม่มีข้อมูลจำเพาะ 'LLLL'
Anfet

12

Joda-Time

วิธีการเกี่ยวกับการใช้Joda เวลา เป็น API วันเวลาที่ดีกว่ามากที่จะใช้งานได้ (และJanuaryหมายถึงเดือนมกราคมที่นี่ไม่เหมือนกับปฏิทินที่ใช้0-basedดัชนีเป็นเดือน)

คุณสามารถใช้AbstractDateTime#toString( pattern )วิธีการจัดรูปแบบวันที่ในรูปแบบที่ระบุ:

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

ชื่อเดือนจากหมายเลข

หากคุณต้องการชื่อเดือนสำหรับหมายเลขเดือนใดเดือนหนึ่งคุณสามารถทำได้ดังนี้:

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

แปล

แนวทางข้างต้นใช้ Locale เริ่มต้นปัจจุบันของ JVM ของคุณสำหรับภาษาของชื่อเดือน คุณต้องการระบุวัตถุโลแคลแทน

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

1
ขอบคุณ แต่ฉันมีความสุขกับคนแก่SimpleDateFormatและDate
ogzd

@ogzd. ความปรารถนาของคุณ แต่คุณควรลองดูสิและฉันพนันได้เลยว่าคุณจะต้องชอบร้องเพลงนี้
Rohit Jain

@ogzd. ฉันโพสต์วิธีรับชื่อเดือนจากหมายเลขเดือน BTW ทำไมคุณถึงต้องการทำเช่นนั้น?
Rohit Jain

10

Month::getDisplayName

ตั้งแต่ Java 8 ให้ใช้Monthenum getDisplayNameวิธี localizes ชื่อของเดือนโดยอัตโนมัติ

ผ่าน:

  • A TextStyleเพื่อกำหนดระยะเวลาสั้นหรือสั้นเพียงใด
  • A Localeเพื่อระบุภาษาของมนุษย์ที่ใช้ในการแปลและบรรทัดฐานทางวัฒนธรรมที่ใช้สำหรับตัวย่อเครื่องหมายวรรคตอน ฯลฯ

ตัวอย่าง:

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

9

มันอาจจะเป็นคำถามเก่า ๆ แต่ในฐานะที่เป็นหนึ่งซับในการรับชื่อเดือนเมื่อเรารู้ดัชนีฉันจึงใช้

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

หรือชื่อสั้น ๆ

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

โปรดทราบว่าคุณmonthNumberเริ่มนับจาก 1 ในขณะที่วิธีการใด ๆ ข้างต้นส่งคืนอาร์เรย์ดังนั้นคุณต้องเริ่มนับจาก 0


4

รหัสนี้รองรับภาษา ฉันใช้มันในแอพ Android

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

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

1
สิ่งนี้ใช้งานได้อย่างสมบูรณ์ความคิดเห็นนั้นผิดไปเล็กน้อย
ИвоНедев

3

ฉันพบว่าสิ่งนี้ง่ายกว่ามาก ( 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));
}

ไม่Monthเริ่มดัชนีด้วยมกราคม = 1 ในขณะที่ปฏิทินเริ่มต้นด้วยมกราคม = 0? จะไม่Month.of(calendar.get(Calendar.MONTH));ล้มเหลวในกรณีเดือนมกราคม?
MCO

2

คุณจะได้รับหนึ่งบรรทัดดังนี้: String monthName = new DataFormatSymbols.getMonths()[cal.get(Calendar.MONTH)]


2

สิ่งนี้ใช้ได้กับฉัน:

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

หากต้องการส่งคืน"September"ด้วยบรรทัดเดียว:

String month = getMonthName(9);

2

ทางเดียว:

เรามีMonthAPI ใน Java ( java.time.Month) เราสามารถรับได้โดยใช้Month.of(month);

ที่นี่Monthมีการจัดทำดัชนีเป็นตัวเลขเพื่อให้คุณสามารถระบุMonth.JANUARYหรือจัดทำดัชนีใน API ด้านบนเช่น 1, 2, 3, 4

วิธีที่สอง:

ZonedDateTime.now().getMonth();

มีอยู่ในjava.time.ZonedDateTime.


1

ฉันสร้างส่วนขยาย kotlin ตามคำตอบในหัวข้อนี้และใช้คำตอบ DateFormatSymbols คุณจะได้รับคำตอบในภาษาท้องถิ่น

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
Calender cal = Calendar.getInstance(Locale.ENGLISH)
String[] mons = new DateFormatSymbols(Locale.ENGLISH).getShortMonths();
int m = cal.get(Calendar.MONTH);
String mName = mons[m];

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

1
แม้ว่าคำตอบของคุณอาจถูกต้อง แต่ก็มีคุณภาพไม่ดี โปรดอธิบายอย่างละเอียดว่าเหตุใดคำตอบนี้จึงถูกต้อง
SubliemeSiem

1
@SubliemeSiem ฉันแค่พยายามเปลี่ยนรูปแบบและวิธีที่ง่ายที่สุดในการทำให้เสร็จ: MM- มันจะส่งคืนชื่อเดือนเป็นจำนวนเต็มเช่น 01, 02, 03 MMM - มันจะส่งคืนชื่อเดือนโดยย่อเช่น jan, feb, mar MMMM- จะส่งคืนชื่อเต็มเดือนในรูปแบบสตริงเช่นมกราคม
Amit Mishra

นี่เป็นคำตอบเดียวที่ถูกต้องสำหรับการจัดรูปแบบวันที่ ใช้วัตถุวันที่หรือปฏิทินและจัดรูปแบบด้วยฟอร์แมตเตอร์ คำถามคือBAD
Mickey Perlstein

0

ส่งคืนชื่อภาษาอังกฤษของเดือน 04 ส่งคืน APRIL และอื่น ๆ

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

คำแนะนำที่ง่ายและตรงไปตรงมาขอบคุณ รหัสของคุณไม่ได้รวบรวม คุณจะต้องประกาศประเภทการส่งคืนMonthหรือใช้toStringกับผลลัพธ์ก่อนส่งคืน
Ole VV

-3

จาก SimpleDateFormat java doc:

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

ฉันไม่เห็นว่าคำถามนี้ตอบได้อย่างไร
jhpg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.