【问题标题】:Get the Month from a date string从日期字符串中获取月份
【发布时间】:2021-01-25 13:15:21
【问题描述】:

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

我使用 parseInt、indexOf 和 substring 方法来查找月份并将其存储在月份变量中,但我很难弄清楚如何让程序读取日期。我们假设月份和日期可以是“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));
    

我不想要答案,但请帮助我理解我出错的逻辑,因为根据我的理解,我似乎在第一个和第二个斜杠之间获取索引值并将字符串值转换为 int .

【问题讨论】:

  • 您不应该手动解析。有图书馆,例如日历
  • 但假设您确实想自己解析,请使用 split ("/")
  • 它用于课堂作业,这就是我们被告知手动完成的原因。我需要一些帮助来理解逻辑。
  • 在“现实世界”中 - 使用标准 JAVA 日期库!如果您的(诚然人为的)家庭作业不允许您这样做,请考虑使用regex。其他一切都失败了,您的“firstSlash”代码看起来不错。您需要添加一些“诊断临时变量”和/或逐步调试器来解决剩余代码的问题。 begin 2, end 0 应该给你一个关于问题的提示:) 仅供参考,“split()”也应该工作......

标签: java string date date-format dateformatter


【解决方案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解析日期。

【讨论】:

  • 很棒,但你能详细说明我哪里出错了吗?为什么我们在 indexof 方法中做 firstSlash + 1?
  • 我已经在答案中添加了,您需要从第一个 / 的下一个索引开始搜索,找到的意思是 firstSlash + 1。您目前正在从第一个找到/ 的索引中搜索,因此它将再次返回该索引。
  • date.split("/")这样分割日期不是最简单的吗?
  • @FSm OP 要求了解此代码实际上有什么问题。我知道你的意思是String[] splited = date.split("/");int month = Integer.parseInt (splited[0]);int day = Integer.parseInt (splited[1]);
【解决方案2】:

我不想要答案,但请帮助我理解其中的逻辑 我哪里出错了,因为……

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

  1. 和其他人一样,我建议您使用现代 Java 日期和时间 API java.time 进行日期工作。
  2. 您的代码中似乎有些索引不准确。

java.time

使用java.time 的LocalDate 类获取日期,使用getMonthgetMonthValue 方法获取月份。 java.time 可以解析日期字符串,其中月份和日期可以是“00”或“0”格式。如果您尝试并遇到疑问,我们随时欢迎您提出新问题。

你的代码出了什么问题

这应该足以识别代码中的缺陷:

  1. 从我认为您已经很了解的内容开始:Java 中的索引是从 0 开始的。
  2. 两个参数String.indexOf(String, int) 从给定索引中搜索字符串包含。如果搜索的子​​字符串在您指定的索引处,则返回相同的索引。
  3. 两个参数substring(int, int) 为您提供从 inclusive 到 to-index exclusive 的子字符串。 to-index 需要至少与 from-index 一样大,否则将抛出 StringIndexOutOfBoundsException。异常消息提到了您传递给 substring() 的两个索引,这可能让您有机会回想它们的来源。

预订

我知道我在聚会上迟到了。我还是忍不住发布了我认为不错的答案。

链接

【讨论】:

    【解决方案3】:

    这样做的惯用方法是使用日期时间 API,例如LocalDateDateTimeFormatter如下图:

    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
    

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

    【讨论】:

      猜你喜欢
      • 2020-12-19
      • 1970-01-01
      • 2013-07-22
      • 2021-03-12
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      相关资源
      最近更新 更多