从日期字符串中获取月份
Get the Month from a date string
我有一个日期为“2020 年 10 月 10 日”的字符串输入(假设它们总是用 / 分隔),我试图将每个类别存储在一个已经定义为月、日的私有 int 变量中, 和年份。
我使用 parseInt、indexOf 和 substring 方法找到月份并将其存储在月份变量中,但我很难弄清楚如何让程序读取当天。我们假设月份和日期可以是“00”或“0”格式。
这就是我从字符串中读取月份的方式,这是我到目前为止读取当天的结果,但我收到了一个错误。
java.lang.StringIndexOutOfBoundsException: begin 2, end 0, length 8
到目前为止,这是我的代码,请让我知道我在做什么错误。
int firstSlash = date.indexOf("/");
int secondSlash = date.indexOf("/", firstSlash);
month = Integer.parseInt (date.substring (0, firstSlash));
day = Integer.parseInt (date.substring(firstSlash+1, secondSlash-1));
我不想要答案,但请帮助我理解我出错的逻辑,因为根据我的理解,我似乎在第一个和第二个斜杠之间获取索引值并将字符串值转换为一个整数。
- 首先您需要从找到的第一个
/
的下一个索引开始搜索,这意味着您应该在 date.indexOf("/", firstSlash)
中使用 firstSlash + 1
而不是 firstSlash
。
.substring()
的第二个参数是独占的,所以你需要在date.substring(firstSlash+1, secondSlash-1)
. 中使用secondSlash
而不是secondSlash-1
你的代码应该是这样的
String date = "10/10/2020";
int firstSlash = date.indexOf("/");
int secondSlash = date.indexOf("/", firstSlash + 1);
int month = Integer.parseInt (date.substring (0, firstSlash));
int day = Integer.parseInt (date.substring(firstSlash+1, secondSlash));
最好用LocalDate
存储日期,用DateTimeFormatter
解析日期
惯用的方法是使用 date-time API 例如LocalDate
and DateTimeFormatter
如下图:
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
String strDate = "10/10/2020";
LocalDate date = LocalDate.parse(strDate, DateTimeFormatter.ofPattern("M/d/u"));
int year = date.getYear();
int month = date.getMonthValue();
int dayOfMonth = date.getDayOfMonth();
System.out.println("Year: " + year + ", Month: " + month + ", Day of month: " + dayOfMonth);
}
}
输出:
Year: 2020, Month: 10, Day of month: 10
了解有关现代 date-time API 的更多信息
I don't want the answer but please help me understand the logic of
where I am going wrong because …
这就是我和我们喜欢的态度,真正的学习者的态度。我将提供有用的信息和链接,而不是为您解决错误。
- 像其他人一样,我建议您使用 java.time,现代 java 日期和时间 API,作为您的约会工作。
- 您的代码中似乎有一些索引不准确。
java.time
使用 java.time 的 LocalDate
class 作为日期,使用 getMonth
或 getMonthValue
方法获取月份。 java.time 可以解析日期字符串,其中月份和日期可以是“00”或“0”格式。如果您尝试后 运行 有疑问,欢迎您提出新问题。
你的代码出了什么问题
这应该足以识别代码中的缺陷:
- 首先从我认为您已经很了解的内容开始:Java 中的索引是从 0 开始的。
- two-argument
String.indexOf(String, int)
从给定索引 包含 搜索字符串。如果搜索的子字符串在您指定的索引处,则返回相同的索引。
- two-argument
substring(int, int)
给出了从 from-index 包含 到 to-index 的子串独家。 to-index 需要至少与 from-index 一样大,否则将抛出 StringIndexOutOfBoundsException
。异常消息提到了您传递给 substring()
的两个索引,这可能会让您有机会回想一下它们的来源。
预订
我知道我在聚会上迟到了。我仍然忍不住发布我认为好的答案。
链接
- 对于java.time
- Oracle tutorial: date time
- Documentation of
LocalDate.getMonth()
- Documentation of
DateTimeFormatter
- 一个关于用可能是一位或两位数的数字解析日期的相关问题:
- 用于字符串索引
我有一个日期为“2020 年 10 月 10 日”的字符串输入(假设它们总是用 / 分隔),我试图将每个类别存储在一个已经定义为月、日的私有 int 变量中, 和年份。
我使用 parseInt、indexOf 和 substring 方法找到月份并将其存储在月份变量中,但我很难弄清楚如何让程序读取当天。我们假设月份和日期可以是“00”或“0”格式。
这就是我从字符串中读取月份的方式,这是我到目前为止读取当天的结果,但我收到了一个错误。
java.lang.StringIndexOutOfBoundsException: begin 2, end 0, length 8
到目前为止,这是我的代码,请让我知道我在做什么错误。
int firstSlash = date.indexOf("/");
int secondSlash = date.indexOf("/", firstSlash);
month = Integer.parseInt (date.substring (0, firstSlash));
day = Integer.parseInt (date.substring(firstSlash+1, secondSlash-1));
我不想要答案,但请帮助我理解我出错的逻辑,因为根据我的理解,我似乎在第一个和第二个斜杠之间获取索引值并将字符串值转换为一个整数。
- 首先您需要从找到的第一个
/
的下一个索引开始搜索,这意味着您应该在date.indexOf("/", firstSlash)
中使用firstSlash + 1
而不是firstSlash
。 .substring()
的第二个参数是独占的,所以你需要在date.substring(firstSlash+1, secondSlash-1)
. 中使用
secondSlash
而不是secondSlash-1
你的代码应该是这样的
String date = "10/10/2020";
int firstSlash = date.indexOf("/");
int secondSlash = date.indexOf("/", firstSlash + 1);
int month = Integer.parseInt (date.substring (0, firstSlash));
int day = Integer.parseInt (date.substring(firstSlash+1, secondSlash));
最好用LocalDate
存储日期,用DateTimeFormatter
解析日期
惯用的方法是使用 date-time API 例如LocalDate
and DateTimeFormatter
如下图:
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
String strDate = "10/10/2020";
LocalDate date = LocalDate.parse(strDate, DateTimeFormatter.ofPattern("M/d/u"));
int year = date.getYear();
int month = date.getMonthValue();
int dayOfMonth = date.getDayOfMonth();
System.out.println("Year: " + year + ", Month: " + month + ", Day of month: " + dayOfMonth);
}
}
输出:
Year: 2020, Month: 10, Day of month: 10
了解有关现代 date-time API 的更多信息
I don't want the answer but please help me understand the logic of where I am going wrong because …
这就是我和我们喜欢的态度,真正的学习者的态度。我将提供有用的信息和链接,而不是为您解决错误。
- 像其他人一样,我建议您使用 java.time,现代 java 日期和时间 API,作为您的约会工作。
- 您的代码中似乎有一些索引不准确。
java.time
使用 java.time 的 LocalDate
class 作为日期,使用 getMonth
或 getMonthValue
方法获取月份。 java.time 可以解析日期字符串,其中月份和日期可以是“00”或“0”格式。如果您尝试后 运行 有疑问,欢迎您提出新问题。
你的代码出了什么问题
这应该足以识别代码中的缺陷:
- 首先从我认为您已经很了解的内容开始:Java 中的索引是从 0 开始的。
- two-argument
String.indexOf(String, int)
从给定索引 包含 搜索字符串。如果搜索的子字符串在您指定的索引处,则返回相同的索引。 - two-argument
substring(int, int)
给出了从 from-index 包含 到 to-index 的子串独家。 to-index 需要至少与 from-index 一样大,否则将抛出StringIndexOutOfBoundsException
。异常消息提到了您传递给substring()
的两个索引,这可能会让您有机会回想一下它们的来源。
预订
我知道我在聚会上迟到了。我仍然忍不住发布我认为好的答案。
链接
- 对于java.time
- Oracle tutorial: date time
- Documentation of
LocalDate.getMonth()
- Documentation of
DateTimeFormatter
- 一个关于用可能是一位或两位数的数字解析日期的相关问题:
- 用于字符串索引