【问题标题】:Issue with comparing input to dates from .txt file将输入与 .txt 文件中的日期进行比较的问题
【发布时间】:2016-02-16 21:00:05
【问题描述】:

我正在编写一个与“Transactions.txt”文件交互的程序,该文件的格式如下。

TransactionNumber,ItemName,Quantity,Purchase/HireDate,ReturnDate

其中的内容:

T01,Jumper,5,10/03/2015,14/03/2015
T02,Tuxedo,1,21/04/2015,23/05/2015
T03,Jacket,2,02/07/2015,09/07/2015
T04,Hat,3,12/09/2015,19/09/2015
T05,Shoes,4,09/11/2015,20/11/2015

该程序的目标是获取开始日期并检查文件中的所有日期以查看开始日期是否在任何日期之前,如果是,它将添加项目名称,它是数量,它是购买/雇用日期及其返回日期到要打印的字符串。例如,如果我输入 10/03/2015 作为开始日期,则应打印所有内容,但只打印第 1、2 和 4 行,我不知道问题出在哪里。

我还尝试添加一段代码,该代码将进入结束日期,并检查文件中的任何日期是否在结束日期之后,如果是,则将打印输出,然后它应该完成执行 main (而不是 exit(0) 因为我让它与其他类交互。所以如果我输入 10/03/2015 作为开始日期和 15/03/2015 作为结束日期,只有第 1 行的内容将被打印出来。

我已经尝试解决这个问题几个小时了,但我找不到哪里出了问题,非常感谢任何帮助。

import java.io.*;
import java.util.*;
import java.text.*;
public static File transactionsFile = new File("Transactions.txt");
public class Transaction
{
    public static void main() throws IOException
    {
        try
        {
            String details = "";
            Date tempDate;
            SimpleDateFormat SDF = new SimpleDateFormat("dd/mm/yyyy");
            System.out.print("Enter in a start date (dd/mm/yyyy): ");
            String sDate = userInput.nextLine();
            Date startDate = SDF.parse(sDate);
            System.out.print("Enter in an end date (dd/mm/yyyy): ");
            String eDate = userInput.nextLine();
            Date endDate = SDF.parse(eDate);
            List<String[]> contents = new ArrayList<>();
            Scanner searchTransactionsFile = new Scanner(transactionsFile);
            System.out.println("\n---------Summary of Transactions---------");

            while(searchTransactionsFile.hasNextLine())
            {
                String[] current = searchTransactionsFile.nextLine().split(",");
                contents.add(current);
            }

            for(String[] elements: contents)
            {
                tempDate = SDF.parse(elements[3]);
                if(tempDate.after(startDate) || tempDate.equals(startDate))
                    details += "\nItem Name:\t\t" + elements[1] + "\nQuantity:\t\t" + elements[2] + "\nHire/Purchase Date:\t" + elements[3] + "\nReturn Date:\t\t" + elements[4] + "\n";
            }
            System.out.print(details);
            searchTransactionsFile.close();
        }
        catch(Exception e)
        {
            System.out.println("Invalid date entered. Please enter a valid date in the format dd/mm/yyyy");
        }
    }
}

【问题讨论】:

  • 您遇到的错误是什么?
  • 当我输入 2015 年 3 月 10 日作为开始日期,忽略结束日期并输入任意随机日期时,文件中的所有 5 行都应打印,但仅打印 3/5。

标签: java file date for-loop arraylist


【解决方案1】:

你的 if 条件是错误的。它不考虑结束日期。我已更改逻辑以同时考虑 startDate 和 endDate。看看吧。

if (tempDate.after(startDate) && tempDate.before(endDate))

import java.io.*;
import java.util.*;
import java.text.*;

public class Transaction {
    public static File transactionsFile = new File("Transactions.txt");

    public static void main(String args[]) throws IOException {

        try {

            String details = "";
            Date tempDate;
            SimpleDateFormat SDF = new SimpleDateFormat("dd/mm/yyyy");
            System.out.print("Enter in a start date (dd/mm/yyyy): ");
            Scanner userInput = new Scanner(System.in);
            String sDate = userInput.nextLine();
            Date startDate = SDF.parse(sDate);
            System.out.print("Enter in an end date (dd/mm/yyyy): ");
            String eDate = userInput.nextLine();
            Date endDate = SDF.parse(eDate);
            List<String[]> contents = new ArrayList<>();
            Scanner searchTransactionsFile = new Scanner(transactionsFile);
            System.out.println("\n---------Summary of Transactions---------");

            while (searchTransactionsFile.hasNextLine()) {
                String[] current = searchTransactionsFile.nextLine().split(",");
                contents.add(current);
            }

            for (String[] elements : contents) {
                tempDate = SDF.parse(elements[3]);
                if (tempDate.after(startDate) && tempDate.before(endDate))
                    details += "\nItem Name:\t\t" + elements[1]
                            + "\nQuantity:\t\t" + elements[2]
                            + "\nHire/Purchase Date:\t" + elements[3]
                            + "\nReturn Date:\t\t" + elements[4] + "\n";
            }
            System.out.print(details);
            searchTransactionsFile.close();
        } catch (Exception e) {
            System.out
                    .println("Invalid date entered. Please enter a valid date in the format dd/mm/yyyy");
        }
    }
}

输出:

D:\Study\Examples\src>java Transaction
Enter in a start date (dd/mm/yyyy): 10/03/2015
Enter in an end date (dd/mm/yyyy): 15/03/2015

---------Summary of Transactions---------

Item Name:              Hat
Quantity:               3
Hire/Purchase Date:     12/09/2015
Return Date:            19/09/2015

【讨论】:

  • 我终于知道出了什么问题,谢谢!虽然当我输入 09/03/2015 作为开始日期,然后 21/11/2015 作为结束日期时,文件中的夹克不会被打印,即使它在这些限制范围内。应该打印所有 5 个项目,但只打印了 4 个。
【解决方案2】:

放这条线

public static File transactionsFile = new File("Transactions.txt");

在类定义中。 而且您必须定义userInput 变量。像这样

Scanner userInput = new Scanner(System.in);

您还必须将日期的格式修改为:

SimpleDateFormat SDF = new SimpleDateFormat("dd/M/yyyy");

因为mm 表示分钟,M 表示月份;

【讨论】:

  • 这两行代码使代码块可编译。但实际问题在于 if 逻辑。
  • 哦,对这些错误很抱歉,我将上面的代码作为一个类的方法,它在不同的类中全局声明了扫描仪和文件,我只是忘记将它们放入时正确放置在这里发布一个课程。
  • 现在,ravindra 的第二个答案有什么问题?
  • 当我输入 09/03/2015 作为开始日期,然后输入 21/11/2015 作为结束日期时,文件中的所有日期都在这些约束范围内,这意味着应该打印所有 5 个项目out,但只有 4 个,夹克没有被打印出来。
  • 已经解决了,非常感谢,我忘了 M 需要大写,MM 会和 M 做同样的工作吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多