【问题标题】:Converting strings to dates and comparing in ArrayList Java将字符串转换为日期并在 ArrayList Java 中进行比较
【发布时间】:2015-10-22 06:48:57
【问题描述】:

我对编程和 Java 完全陌生,所以请原谅任何愚蠢的错误和非常糟糕的代码(我不知道如何订购/格式化)。我的任务是制作具有三个功能的视频清单:列出、租用和检查。我有一个 ArrayList ,其中包含当前可用的视频清单。在检查功能下,我希望能够将返回日期字符串转换为日期,然后将其与今天的日期进行比较。如果返回日期和今天的日期相等,我想返回一条消息说:“视频今天到期”,如果返回日期已过(早于今天的日期),我想返回一条消息说“视频过期”。

我一直在研究如何将字符串转换为日期,反之亦然,并且整天都在尝试使用它以及更多尝试使其工作,但我似乎无法让它工作。我知道有很多类似的问题已经被询问和回答,但我已经尝试关注它们并且它不起作用。任何帮助将非常感激。正如我之前所说,我是一个完全的新手,所以请原谅任何愚蠢。

整个程序代码:

import java.text.DateFormat;
import java.text.ParseException;
import java.time.LocalDate;
import java.util.*;

class InventoryRow {
private String name;
private String type;
private Character availability;
private String returndate;

public InventoryRow(String name, String type, Character availability, String returndate) {
    this.name = name;
    this.type = type;
    this.availability = availability;
    this.returndate = returndate;
}

public String getReturndate() {
    return returndate;
}

public void setReturndate(String returndate) {
    this.returndate = returndate;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

public Character getAvailability() {
    return availability;
}

public void setAvailability(Character availability) {
    this.availability = availability;
}

public String toString() {
    return name + "   " + type + "   " + availability + "   " + returndate;
}
}

public class InventorySort {

public static void main(String[] args) throws ParseException {
    List<InventoryRow> videos = new ArrayList<InventoryRow>();

    videos.add(new InventoryRow("Casablanca", "Old", 'Y', null));
    videos.add(new InventoryRow("Jurassic Park", "Regular", 'N', "2015-07-30"));
    videos.add(new InventoryRow("2012", "Regular", 'Y', null));
    videos.add(new InventoryRow("Ant-Man", "New", 'Y', null));

    LocalDate dateReturn = LocalDate.now().plusDays(3);

    LocalDate dateToday = LocalDate.now();

    Scanner input = new Scanner(System.in);

    // Output the prompt
    System.out.println("Do you want to list (l), rent (r) or check (c)?");

    // Wait for the user to enter a line of text
    String line = input.nextLine();

    // List, rent and check functions
    // List function
    if (line.equals("l")) {
        // //////////////////////////// Sort function
        Collections.sort(videos, new Comparator<InventoryRow>() {
            public int compare(InventoryRow o1, InventoryRow o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });
        for (InventoryRow inventory : videos) {
            System.out.println(inventory);
        }
        // /////////////////////////// Rent function
    } else if (line.equals("r")) {
        System.out.println("Which video would you like to rent?");
        String line2 = input.nextLine();
        // /////////////////////////// Search through ArrayList
        boolean foundIt = false;
        for (InventoryRow ir : videos) {
            if (line2.equals(ir.getName()) && ir.getAvailability() == 'Y') {
                foundIt = true;
                break;
            }
        }
        if (foundIt) {
            System.out.println("Video available to rent! Would you like to rent this video?");
            String line3 = input.nextLine();
            if (line3.equals("Yes")) {
                System.out.println("You have rented this video until " + dateReturn + ".");
                for (InventoryRow ir : videos) {
                    if (ir != null && line2.equals(ir.getName())) {
                        ir.setAvailability('N');
                        ir.setReturndate(dateReturn.toString());
                        // //////////////// Just to test if this works
                        for (InventoryRow inventory : videos) {
                            System.out.println(inventory);
                        }
                    }
                }
            } else {
                System.out.println("You have not rented this video.");
            }

        } else {
            System.out.println("Video unavailable to rent.");
        }
        // /////////////////////////// Check function
    } else if (line.equals("c")) {
        System.out.println("Which video would you like to check is in the inventory?");
        String line4 = input.nextLine();
        // /////////////////////////// Search through ArrayList
        boolean foundIt = false;
        for (InventoryRow ir : videos) {
            if (line4.equals(ir.getName())) {
                foundIt = true;
                break;
            }
        }
        if (foundIt) {
            System.out.println("Video found!");
            for (InventoryRow ir : videos) {
                LocalDate returnDate = LocalDate.parse(ir.getReturndate());
                if (line4.equals(ir.getName()) && ir.getAvailability() == 'N' && returnDate.isEqual(dateToday)) {
                    System.out.println("Video due for return today.");
                } else if (line4.equals(ir.getName()) && ir.getAvailability() == 'N'
                        && returnDate.isBefore(dateToday)) {
                    System.out.println("Video is overdue!");
                } else if (line4.equals(ir.getName()) && ir.getAvailability() == 'N') {
                    System.out.println("Video is due for return on: " + ir.getReturndate());

                }
            }
        } else {
            System.out.println("Video not found. Please see the inventory below.");
            Collections.sort(videos, new Comparator<InventoryRow>() {
                public int compare(InventoryRow o1, InventoryRow o2) {
                    return o1.getName().compareTo(o2.getName());
                }
            });
            for (InventoryRow inventory : videos) {
                System.out.println(inventory);
            }
        }
        // /////////////////////////// If anything else is entered
    } else {
        System.out.println("The only options are to list (l), rent (r) or check (c).");
    }

}
}

这是不工作的位,我不知道为什么:

if (foundIt) {
            System.out.println("Video found!");
            for (InventoryRow ir : videos) {
                LocalDate returnDate = LocalDate.parse(ir.getReturndate());
                if (line4.equals(ir.getName()) && ir.getAvailability() == 'N' && returnDate.isEqual(dateToday)) {
                    System.out.println("Video due for return today.");
                } else if (line4.equals(ir.getName()) && ir.getAvailability() == 'N'
                        && returnDate.isBefore(dateToday)) {
                    System.out.println("Video is overdue!");
                } else if (line4.equals(ir.getName()) && ir.getAvailability() == 'N') {
                    System.out.println("Video is due for return on: " + ir.getReturndate());

                }
            }

这是我收到的错误消息:

Exception in thread "main" java.lang.NullPointerException: text
at java.util.Objects.requireNonNull(Objects.java:228)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1846)
at java.time.LocalDate.parse(LocalDate.java:400)
at java.time.LocalDate.parse(LocalDate.java:385)
at InventorySort.main(InventorySort.java:141)

【问题讨论】:

  • “不工作” - 怎么样?您应该给出您尝试过的代码的简短 sn-ps,并告诉我们究竟是什么在其中不起作用。整个程序真的无关紧要。您只需要向我们提供显示您的问题的最少代码即可。两个注意事项:(1)最好从一开始就将数据保留为日期,而不是在搜索时转换它。在存储到列表之前输入数据并转换。 (2) 考虑使用 Java 8 的LocalDate,而不是古老而有问题的Date
  • 感谢您告诉我。我添加了不起作用的代码并添加了我收到的错误消息。我还更改了代码以使用 LocalDate 而不是 Date。

标签: java string date arraylist calendar


【解决方案1】:

来自您的示例:

// 获取今天的日期

    Date todayDate = Calendar.getInstance().getTime();
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.UK);

您有以下字符串格式的返回日期:

videos.add(new InventoryRow("侏罗纪公园", "常规", 'N', “2015 年 7 月 30 日”));

现在的当天和返回日期之间的差异:

        Date todayDate = Calendar.getInstance().getTime();
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.UK);
        String currDateStr = dateFormat.format(todayDate);
        String returnDateStr = "01/08/2015";
        Date returnDate = null;
        try {
            returnDate = dateFormat.parse(returnDateStr);
            todayDate = dateFormat.parse(currDateStr);
        }
        catch (ParseException e) {
            e.printStackTrace();
        }
        long diffInDays = (todayDate.getTime() - returnDate.getTime()) / (24 * 60 * 60 * 1000);
        if (diffInDays == 0) {
            System.out.println("Video is due today!");
        }
        else if (diffInDays > 0) {
            System.out.println("Video is overdue :(");
        }
        else {
            System.out.println("Video returned in advance :) ");
        }

【讨论】:

  • 谢谢,但问题是代码顶部的输入字符串会根据用户的输入而变化,因此我需要从 ArrayList 中指定的 InventoryRow 获取返回日期。这对它有用吗?
  • 是的。如果InventoryRow 的返回日期字符串格式为dd/MM/yyyy
  • 但是如何更改您的代码,以便不设置返回日期字符串,但可以根据用户在 line4 中输入的视频进行更改?每个视频都有不同的返回日期,因此 2015 年 7 月 30 日仅适用于侏罗纪公园。我知道现在我的数组列表中只有一个返回日期,但将来我会更多。
  • 好吧,我想我已经解决了,但由于某种原因,当我将侏罗纪公园的返回日期设置为 01/08/2015 时,它返回“视频今天到期!”即使那是明天?但是,如果我将返回日期设置为将来的任何其他日期(02/08/2015 及以后),它就可以正常工作。如果我将它设置为今天、昨天等,我也会得到正确的结果。这似乎是明天的问题。你知道为什么会这样吗?
  • 问题是我们没有截断保存当前日期值的todayDate 中的时间。现在修改了答案。
【解决方案2】:

您可以做的一件事是将表示日期的字符串转换为数字,而不是试图隐藏“日期”。在这种情况下,您执行此操作的方法是将 String 解析为 Integer。例如:

class Example {
    public static void main(String[] args) {
        String Date = "07/30/2015";
        String[] DatesTxt = Date.split("/");
        int[] DatesInt = new int[3];
        for (int i = 0; i < DatesTxt.length; i++) {
            DatesInt[i] = Integer.parseInt(DatesTxt[i]);
        }
        if (DatesInt[1] < 31) {
            System.out.println("And look am comparing dates!");
        }
    }
}

我希望这会有所帮助:)。

【讨论】:

  • 谢谢,但我非常热衷于转换为日期并使用它们进行比较,除非这绝对是唯一的方法。但我一定会记住这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
相关资源
最近更新 更多