Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从月份名称获取月份编号_Java_Date - Fatal编程技术网

Java 从月份名称获取月份编号

Java 从月份名称获取月份编号,java,date,Java,Date,我有这个 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String monthName = br.readLine(); 如何获取monthName变量中包含的月数? 谢谢 使用Java的类。它可以将任何给定字符串解析为有效的日历实例。 下面是一个示例(假设月份为英语) 您可以在以下位置指定语言: 默认情况下,Java使用用户的本地语言来解析字符串 请记住,计算机从0开始计数。因此,

我有这个

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String monthName = br.readLine();
如何获取monthName变量中包含的月数? 谢谢

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

您可以在以下位置指定语言:

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

请记住,计算机从0开始计数。因此,1月份将是0。如果您想要一个人类可读的日期,则应设置日历实例的格式:

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

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

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
}
如果您想要一个以1开头的月数,只需在结果中添加1即可(更直观,也是我的建议)。

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

public static int monthAsNumber(
弦月,
语言环境,
布尔值缩写,
布尔不区分大小写,
布尔独立
) {
文本风格;
月[]月=月。值[];
if(缩写){
style=standAlone?TextStyle.SHORT\u standAlone:TextStyle.SHORT;
}否则{
style=standAlone?TextStyle.FULL\u standAlone:TextStyle.FULL;
}
if(不区分大小写){
对于(int i=0;i<12;i++){
if(月[i].getDisplayName(样式、区域设置).equalsIgnoreCase(月)){
return i;//在旧的JDK pre 8中,月索引通常是基于零的!
}
}
}否则{
对于(int i=0;i<12;i++){
if(月[i].getDisplayName(样式、区域设置).equals(月)){
return i;//在旧的JDK pre 8中,月索引通常是基于零的!
}
}
}
return-1;//不匹配
}

如果您有月份名称,并且需要与该月份对应的整数 试试这个


Java 8中的英文月名解决方案

private int getMonthNumber(String monthName) {
    return Month.valueOf(monthName.toUpperCase()).getValue();
}

将其标记化。使用split。你能添加更多信息吗?你的意思是线上唯一的标记是月名吗?在这种情况下,您应该只使用开关/案例控制流(如果您在1.7+中),案例语句是名称,返回是月份。如果没有,按照@KickButtowski说的做,然后这样做。你想解析一个数字还是一个月的名字?你能举个例子吗?也许你可以使用
映射
将姓名(用你喜欢的语言)存储到月数(
0
1
基于;
日历
基于
0
基于)如果你给出一些你所期望的输入的例子,会有所帮助。有很多可能性。例如,它是否只是英文中的全名?或者你需要缩写的支持?其他语言呢?javadocs说明了使用什么。好吧,它在Java6中运行良好,但我将更新Java8+的答案。不推荐使用。从JDK版本1.1开始,由Calendar.get(Calendar.MONTH)代替。它保留在那里只是为了向后兼容,可能会在将来的版本中删除!工作的事实并不意味着它是有效的代码。您仍在使用已弃用的
Date#getMonth
(意思是:不要使用它)。使用
日历
检索月份。或者,如果您使用的是Java 8,请使用新的来完成这项工作。此外,它会返回0-11作为月份编号,您可能会期望1-12。关于“索引是基于零的”的评论让我提醒人们,枚举可以在您的代码中使用,而不是
int
值。不要在10月份传递
10
或基于零的
9
,而是传递
月份。10月份
,一个实际的类型安全对象,而不是“幻数”。通过替换
返回i修改示例代码
返回月[i]
Enum
是Java中非常重要的特性,一旦掌握了窍门,它将非常有用。请参阅。@BasilBourque右侧,我这样写我的贡献是因为OP明确地想要一个数字,该数字为解释提供了空间,但我更喜欢像您一样使用enum作为返回类型。OP的唯一“缺点”可能是,由于方法签名的不兼容更改,他/她将被迫重写其应用程序,但最终这种重构将是OP的胜利。
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
}
System.out.println(monthAsNumber("MÄRZ", Locale.GERMANY, false, true));
// output: 2 (zero-based!)
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
}
try{   
        Date date = new SimpleDateFormat("MMM").parse(monthName);//put your month name here
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        monthNumber=cal.get(Calendar.MONTH);
        System.out.println(monthNumber);

 }
catch(Exception e)
{
 e.printStackTrace();
}
private int getMonthNumber(String monthName) {
    return Month.valueOf(monthName.toUpperCase()).getValue();
}