首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从月名中获取月号

从月名中获取月号
EN

Stack Overflow用户
提问于 2014-06-22 20:35:29
回答 4查看 61.4K关注 0票数 23

我有这个。

代码语言:javascript
复制
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String monthName = br.readLine();

如何获得monthName变量中包含的月份号?谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-06-22 20:44:31

使用Java的日历类。它可以将任何给定的字符串解析为有效的日历实例。下面是一个例子(假设这个月是英文的)。

代码语言:javascript
复制
Date date = new SimpleDateFormat("MMMM", Locale.ENGLISH).parse(monthName);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
println(cal.get(Calendar.MONTH));

可以在SimpleDateFormat中指定语言

代码语言:javascript
复制
String monthName = "März"; // German for march
Date date = new SimpleDateFormat("MMMM", Locale.GERMAN).parse(monthName);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
println(cal.get(Calendar.MONTH));

默认情况下,Java使用用户的本地来解析字符串。

请记住,计算机从0开始计数。所以,一月是0。如果您想要一个人类可读的日期,您应该格式化日历实例:

代码语言:javascript
复制
SimpleDateFormat inputFormat = new SimpleDateFormat("MMMM");
Calendar cal = Calendar.getInstance();
cal.setTime(inputFormat.parse(monthName));
SimpleDateFormat outputFormat = new SimpleDateFormat("MM"); // 01-12
println(outputFormat.format(cal.getTime()));
票数 36
EN

Stack Overflow用户

发布于 2015-10-26 16:17:26

英文月名用Java 8的解决方案。

代码语言:javascript
复制
private int getMonthNumber(String monthName) {
    return Month.valueOf(monthName.toUpperCase()).getValue();
}
票数 18
EN

Stack Overflow用户

发布于 2014-06-23 09:35:50

使用java.text.DateFormatSymbols的另一种方法是:

代码语言:javascript
复制
public static int monthAsNumber(
  String  month,
  Locale  locale,
  boolean abbreviated,
  boolean caseInsensitive
) {
  DateFormatSymbols dfs = new DateFormatSymbols(locale);
  String[] months = (abbreviated ? dfs.getShortMonths() : dfs.getMonths());

  if (caseInsensitive) {
    for (int i = 0; i < 12; i++) {
      if (months[i].equalsIgnoreCase(month)) {
        return i; // month index is zero-based as usual in old JDK pre 8!
      }
    }
  } else {
    for (int i = 0; i < 12; i++) {
      if (months[i].equals(month)) {
        return i; // month index is zero-based as usual in old JDK pre 8!
      }
    }
  }
  return -1; // no match
}

seach方法的提议签名说明了许多可能的变化。示例:

代码语言:javascript
复制
System.out.println(monthAsNumber("MÄRZ", Locale.GERMANY, false, true));
// output: 2 (zero-based!)

如果您想要一个从1开始的月份号,那么只需将1添加到结果中(更直观,也是我的建议)。

从Java 8开始,您也有了一个新的变体,即独立月份。虽然在英语中,这些月份的名称在其他语言中是相同的,但它们并不总是相同的(例如,在捷克语中,"leden“(1月)而不是"ledna")。要实现这些独立表单,可以使用Month.getDisplayName(.) (未测试):

代码语言:javascript
复制
public static int monthAsNumber(
  String  month,
  Locale  locale,
  boolean abbreviated,
  boolean caseInsensitive,
  boolean standAlone
) {
  TextStyle style;
  Month[] months = Month.values[];

  if (abbreviated) {
    style = standAlone ? TextStyle.SHORT_STANDALONE : TextStyle.SHORT;
  } else {
    style = standAlone ? TextStyle.FULL_STANDALONE : TextStyle.FULL;
  }

  if (caseInsensitive) {
    for (int i = 0; i < 12; i++) {
      if (months[i].getDisplayName(style, locale).equalsIgnoreCase(month)) {
        return i; // month index is zero-based as usual in old JDK pre 8!
      }
    }
  } else {
    for (int i = 0; i < 12; i++) {
      if (months[i].getDisplayName(style, locale).equals(month)) {
        return i; // month index is zero-based as usual in old JDK pre 8!
      }
    }
  }
  return -1; // no match
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24355504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档