陷入困境;两个日期之间的计算天数

时间:2013-11-21 02:12:40

标签: java date while-loop

我实际上已经在这个网站上浏览了很长时间,遗憾的是没有太大进展。感谢很多非常有用的答案,我已经学到了很多东西!

我正在学习Java ...大约4天(我猜?)所以我对我可以使用的方法不是很有经验。

我们在大学里完成了这项任务。我们将编写一个程序,返回两个日期之间已经过了多少天。唯一的限制是保持程序尽可能简单,我们不允许使用“复杂的方法”。 可悲的是,我的计划有点卡住了。如果我尝试一下,例如日期23 01 1994年和07 04 1997年,它只计到1997年01 01并突然停止。我不知道为什么会这样,我甚至怀疑我是否完全理解我在那里所写的内容。

无论如何,这是我的代码:

import java.util.Arrays;
import java.util.Scanner;

public class Datecalc {

public static int yearcounter,monthcounter,daycounter,days;

public static int[] input() {

    Scanner input = new Scanner(System.in);

    //Eingabe der Daten
    String day1 = input.next();
    String month1 = input.next();
    String year1 = input.next();

    String day2 = input.next();
    String month2 = input.next();
    String year2 = input.next();


    int day1int = Integer.parseInt(day1);
    int month1int = Integer.parseInt(month1);
    int year1int = Integer.parseInt(year1);

    int day2int = Integer.parseInt(day2);
    int month2int = Integer.parseInt(month2);
    int year2int = Integer.parseInt(year2);

    int [] eingabe = new int [6];

        eingabe[0] = day1int;
        eingabe[1] = month1int;
        eingabe[2] = year1int;

        eingabe[3] = day2int;
        eingabe[4] = month2int;
        eingabe[5] = year2int;

    return eingabe; 

// put everything into an array to be able to use it in the main method

}

public static void main(String[] args) {

    int[] eingabe = input();

    days=0;

    daycounter = eingabe[0];
    monthcounter = eingabe[1];
    yearcounter = eingabe[2];

    Integer[] einunddreissig = {1,3,5,7,8,10,12}; //months with 31 days
    Integer[] dreissig = {4,6,9,11}; // months with 30 days

    while (daycounter != eingabe[3] && monthcounter != eingabe[4] && yearcounter != eingabe[5] ) {

        // if its a month that has 31 days
        if ( Arrays.asList(einunddreissig).contains(monthcounter) ) {

            for (int i = daycounter; i <= 31; i++) {
                days++;
            }
                daycounter=1;
                monthcounter++;


        } 

        // if its a month with 30 days
        if ( Arrays.asList(dreissig).contains(monthcounter) ) {
            for (int i = daycounter; i <= 30; i++) {
                days++;
                daycounter++;                   
            }
                daycounter=1;
                monthcounter++;

        // february     
        } else if ( monthcounter == 2) {
            for (int i = daycounter; i <= 28; i++) {
                days++;
            }
                daycounter=1;
                monthcounter++;

        } else if (monthcounter==13) {
            monthcounter=1;
            yearcounter++;
        }
    }

        // checking how many days were counted and comparing the input (eingabe[something]) to how far the daycounter reached
        System.out.println(" "+days);
        System.out.println(" "+daycounter+" "+monthcounter+" "+yearcounter);
        System.out.println(eingabe[3]+" "+eingabe[4]+" "+eingabe[5]);
}
}   

我希望有人可以如此友善地给我一个如何解决这个问题的提示。

3 个答案:

答案 0 :(得分:0)

你必须使用循环吗?这里有一些值得思考的东西 - 想象这是一个简单的代数问题。在您的程序中,每个日期都被建模为一组数量,每个数量都是不同的单位。一旦获得统一单位,就可以进行算术运算。

在UNIX世界中,我们使用一个名为“epoch”的约定参考日期,1970年1月1日上午12:00作为参考日期。有点像平衡的“皮重”。所有其他日期可以表示为相对于该时间的某个秒数。

答案 1 :(得分:0)

我会把它分成两个不同的功能,一个用于计算当前年末的天数,另一个用于计算当年开始以来的天数。然后,您可以根据这些值计算总天数。

首先编写一个通用sum()函数:

public static int sum(int[] a, int start, int end){
    int sum = 0;
    for(int i = start; i < end; i++) sum += a[i];
    return sum;
}

然后使用sum()功能轻松计算daysToEnddaysFromStart

static int[] daysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

public static int daysToEnd(int day, int month){
    return sum(daysInMonth, month - 1, 12) - day;
}

public static int daysFromStart(int day, int month){
    return sum(daysInMonth, 0, month - 1) + day;
}

public static void main(String... args){
    int[] date1 = {23, 1, 1994};
    int[] date2 = {1, 1, 1997};

    // This actually works for same or different years
    int days = daysToEnd(date1[0], date1[1]) +
               365*(date2[2] - date1[2] - 1) +
               daysFromStart(date2[0], date2[1]);

    System.out.println(days);
}

答案 2 :(得分:0)

我会将传入的用户输入构造为java.util.Date类型。但我假设逐行输入。如果你想分别获得day,mth,year,你可以使用StringBuilder构造一个字符串。

try{
  BufferedReader br = new BufferedReader(
              new InputStreamReader(System.in));

  DateFormat df = new SimpleDateFormat ("dd/MM/yyyy");

  System.out.println("Enter Date1");

  String dateSt1= br.readLine();       // Accepts date1 as string 

  System.out.println("Enter Date2");  

  String dateSt2= br.readLine();  // Accepts date2 as string 

  Date date1=df.parse(dateSt1);     // Date String to Date
  Date date2=df.parse(dateSt2);
}catch(IOException ex)
}catch(ParseExceptionOfSomesort pex)
}

然后使用它来获得天数差异 -

int diffInDays = (int)( (date2.getTime() - date1.getTime()) 
             / (1000 * 60 * 60 * 24) )

如果你认为这是负面的,那就意味着第二个日期是在第一个日期之前。

想一想:我是否必须使用循环或者是否已经添加了一些实用工具方法来进行日期比较?

是什么让某些事情变得“复杂”?编写太多代码行或使用现有的java库?