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