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

gcmastyq  于 2022-12-21  发布在  Java
关注(0)|答案(6)|浏览(188)

我有这个。

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String monthName = br.readLine();

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

wz3gfoph

wz3gfoph1#

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

Date date = new SimpleDateFormat("MMMM", Locale.ENGLISH).parse(monthName);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
println(cal.get(Calendar.MONTH));

您可以在SimpleDateFormat中指定语言:

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开始计数。因此,January将为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()));
jgwigjjp

jgwigjjp2#

英语月份名称的Java 8解决方案。

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

tp5buhyn3#

使用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
}

搜索方法的建议签名说明了许多可能的变化。例如:

System.out.println(monthAsNumber("MÄRZ", Locale.GERMANY, false, true));
// output: 2 (zero-based!)

如果你想要一个从1开始的月份数字,那么只需要在结果中加上1(更直观,也是我的建议)。

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

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
}
btxsgosb

btxsgosb4#

如果您有月份名称,并且想要与该月份相对应整数,请尝试

try{   
        Date date = new SimpleDateFormat("MMM", Locale.ENGLISH).parse(monthName);//put your month name in english here
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        monthNumber=cal.get(Calendar.MONTH);
        System.out.println(monthNumber);

 }
catch(Exception e)
{
 e.printStackTrace();
}
dhxwm5r4

dhxwm5r45#

* Java时间 *

2014年3月,modern date-time API API取代了容易出错的java.util日期时间API及其格式化API SimpleDateFormat。从那时起,强烈建议停止使用旧版API。

    • 使用java.time(现代日期-时间API)的解决方案:**

使用模式为MMMMDateTimeFormatter来解析给定的日期。如果月份的名称可以是不同的大小写,则应构建并使用不区分大小写的DateTimeFormatter

    • 演示**:
import java.time.Month;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Locale;

class Main {
    public static void main(String[] args) {
        // A sample month
        String monthName = "March";
        DateTimeFormatter parser = DateTimeFormatter.ofPattern("MMMM", Locale.ENGLISH);
        Month month = Month.from(parser.parse(monthName));
        int monthNumber = month.getValue();
        System.out.println(monthNumber);

        // A case-insensitive formatter
        DateTimeFormatter parserIgnoreCase = new DateTimeFormatterBuilder()
                                                    .parseCaseInsensitive()
                                                    .appendPattern("MMMM")
                                                    .toFormatter(Locale.ENGLISH);

        System.out.println(Month.from(parserIgnoreCase.parse("march")).getValue());
    }
}
    • 输出**:
3
3

从**Trail: Date Time**了解有关现代日期-时间API的更多信息。

ru9i0ody

ru9i0ody6#

使用Java 8 API

final DateTimeFormatter dtFormatter = DateTimeFormatter.ofPattern("MMM").withLocale(Locale.ENGLISH);
final TemporalAccessor temporalAccessor = dtFormatter.parse(month);
final int monthNumber = temporalAccessor.get(ChronoField.MONTH_OF_YEAR);

相关问题