Java 从日期字符串获取月份

Java 从日期字符串获取月份,java,string,date,date-format,dateformatter,Java,String,Date,Date Format,Dateformatter,我有一个日期为“10/10/2020”(假设它们总是用/)的字符串输入,我试图将每个类别存储在一个私有int变量中,该变量已定义为月、日和年 我使用parseInt、indexOf和substring方法查找月份并将其存储在month变量中,但我很难弄清楚如何让程序读取当天。我们假设月和日可以是“00”或“0”格式 这是我从字符串中读取月份的方式,这是我到目前为止读取的日期,但我得到了一个错误 java.lang.StringIndexOutOfBoundsException:开始2,结束0,长

我有一个日期为“10/10/2020”(假设它们总是用/)的字符串输入,我试图将每个类别存储在一个私有int变量中,该变量已定义为月、日和年

我使用parseInt、indexOf和substring方法查找月份并将其存储在month变量中,但我很难弄清楚如何让程序读取当天。我们假设月和日可以是“00”或“0”格式

这是我从字符串中读取月份的方式,这是我到目前为止读取的日期,但我得到了一个错误

java.lang.StringIndexOutOfBoundsException:开始2,结束0,长度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
  • .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
解析日期。

惯用的方法是使用日期时间API,例如和,如下所示:

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
有关现代日期时间API的更多信息,请访问

我不想要答案,但请帮我理解这个问题的逻辑 我错在哪里,因为

这就是我和我们喜欢的态度,一个真正的学习者的态度。我将提供有用的信息和链接,而不是为您解决您的错误

  • 与其他人一样,我建议您使用java.time(现代java日期和时间API)进行日期工作
  • 您可能会发现代码中存在一些索引错误
  • java.time 使用java.time的
    LocalDate
    类获取日期及其
    getMonth
    getMonthValue
    方法获取月份。time可以解析日期字符串,其中月份和日期可以是“00”或“0”格式。如果你尝试了,但遇到了疑问,欢迎你提出新问题

    你的代码出了什么问题 这应该足以识别代码中的缺陷:

  • 首先,我认为您已经很清楚:Java中的索引是基于0的
  • 两个参数
    String.indexOf(String,int)
    从给定的索引中搜索字符串。如果搜索的子字符串位于指定的索引处,则返回相同的索引
  • 两个参数
    substring(int,int)
    为您提供从包含索引的from到包含索引的to的子字符串。to索引必须至少与from索引一样大,否则将抛出
    StringIndexOutOfBoundsException
    。异常消息提到了传递给
    substring()
    的两个索引,这可能会让您有机会回顾它们的来源
  • 预订 我知道我在聚会上迟到了。我还是忍不住贴出我认为是个好答案的帖子

    链接
    • 对于java.time
      • 有关使用一位或两位数字解析日期的相关问题:
    • 用于字符串索引

    您不应该手动解析。有这样的库,例如Calendar,但假设您确实想自己解析,请将split(“/”)Its用于类赋值,这就是为什么我们被告知手动执行此操作的原因。我需要一些理解逻辑的帮助。在“现实世界”中-使用标准JAVA数据库!如果你(公认的)人工作业不会让你这样做,考虑使用A。如果其他所有操作都失败,您的“firstSlash”代码看起来还可以。您需要添加一些“诊断临时变量”和/或逐步通过调试器对剩余代码进行故障排除<代码>开始2,结束0应该会给你一个问题提示:)仅供参考,“split()”也应该有效…非常好,但你能详细说明我哪里出了问题吗?为什么我们在indexof方法中使用firstSlash+1?我已经在答案中添加了,您需要从first
    /
    found means
    的下一个索引中搜索firstSlash+1
    。您当前正在从找到的第一个索引
    /
    进行搜索,因此它将再次返回该索引。像
    date这样拆分日期并不容易。拆分(“/”
    ?@FSm OP要求了解此代码的实际错误。我知道你的意思是
    String[]splited=date.split(“/”);int month=Integer.parseInt(拆分为[0]);int day=Integer.parseInt(拆分为[1])