【问题标题】:Date program and incrementing each day日期程序和每天递增
【发布时间】:2014-11-17 22:59:52
【问题描述】:

我完全迷失在这个问题上。我们将创建一个允许用户输入日期(月、日、年)的程序,该程序应打印出该日期并在之后每天递增 1。如果输入的日期是该月的最后一天。月份需要加一,第二天应该从1开始。如果是12月31日,则输入xxx1。那么月、日和年应更改为 1 月 1 日,xxx2。此外,如果日期是闰年。比如说输入是 2009 年 2 月 15 日。如果不是闰年,日期应该增加到 2 月 29 日,它应该打印出 2 月 28 日。

我完全不知道如何解决这个问题。如果有人能指出我正确的方向,我将不胜感激。

这里有什么:

package date;

public class Date 
{
  private static final int February = 2;
  private static final int December = 12;
  private int month;
  private int day;
  private int year;

  public Date()
  {
    month = 1;
    day = 1;
    year = 2000;
  }

  public Date(int month, int day, int year)
  {
    this.month = month;
    this.day = day;
    this.year = year;       
  }

  public void setMonth(int month)
  {
    this.month = month;
  }

  public void setDay(int day)
  {
    this.day = day;
  }

  public void setYear(int year)
  {
    this.year = year;
  }

  public int getMonth(int month)
  {
    return month;
  }

  public int getDay(int day)
  {
    return day;
  }

  public static int getYear(int year)
  {
    return year;
  }

  public boolean nextDay()
  { 
    boolean leapYear = false;
    int currentMonthMaxDays;
    int [] daysInMonths = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    currentMonthMaxDays = daysInMonths[month];
    if(day < currentMonthMaxDays)
    {
        day = day + 1;
        day++;
    }

    else if(month == February && leapYear && day == 28)
    {
        day = 29;
        day++;
    }
        else day = 1;

            if(month != December)

                month +=1;

                else 
                    year+=1;
                    month = 1;

    while(!leapYear)
    {
        if(year % 400 ==0)
            leapYear = true;
        else if(year % 4 == 0 && year % 100 != 0)
            leapYear = true;

    }
        return leapYear;
  } 

}

我认为我正确地完成了 Date.java 类,我的问题在于主类。我们必须创建一个将日期递增 1 的数组。我试图查看每月最多 30-31 天。

这是 DateTest 主要内容:

 package date;
 import java.text.SimpleDateFormat;
 import java.util.Date;


 import javax.swing.JOptionPane;
 public class DateTest {


 public static void main(String[] args) 
 {
    Date [] date = new Date[2];

    for(int i = 1; i < date.length; i++)
    {
        JOptionPane.showInputDialog("Enter Date (e.g. 19991231): ");
        date[i] = new Date();
        i++;
    }
    new SimpleDateFormat("EEEE, MMMM d, yyyy");
    JOptionPane.showMessageDialog(null, "Date: " + date, "Results", JOptionPane.PLAIN_MESSAGE);
 }
}

我肯定知道我的主干很顶。我真的迷失了这个任务。

【问题讨论】:

  • 为什么不使用java.util.Calendar
  • @JigarJoshi 好吧,根据问题的措辞(“我们必须这样做”),这可能是针对一堂课的,弄清楚这背后的数学逻辑是作业的一部分任务。
  • 我认为问题出在你的测试课上......
  • 将日期存储为 1970 年 1 月 1 日之后的天数可能会更简单。您必须将日期转换为整数,然后将整数转换为日期,但是天数的增量会很简单。
  • 你的问题不是很清楚——你想在下个月之前打印第二天还是接下来的所有日子,还是什么?为什么你的 nextDay 函数返回一个布尔值?

标签: java date


【解决方案1】:

我评论说,在内部将日期存储为基准日期之后的天数会更容易编码。

这是 Date 类的一个版本,它在内部将日期存储为基准日期之后的天数:

package com.ggl.testing;

import java.security.InvalidParameterException;

public class Date {

    private static final boolean DEBUG = false;

    private static final int BASE_MONTH = 1;
    private static final int BASE_YEAR = 1700;

    private int days; 

    public Date(int month, int day, int year) {
        setDate(month, day, year);
    }

    public void setDate(int month, int day, int year) {
        if ((month >= 1) && (month <= 12)) {            
        } else {
            String s = "Month not between 1 and 12";
            throw new InvalidParameterException(s); 
        }

        if (year >= BASE_YEAR) {
            int temp = calculateMonthDays(month, year);
            if ((day >= 1) && (day <= temp)) {              
            } else {
                String s = "Day not between 1 and " + temp;
                throw new InvalidParameterException(s); 
            }

            int days = calculateYearDays(year); 
            if (DEBUG)  {
                System.out.println(days);
                System.out.println(temp);
            }

            days += temp;
            this.days = days + day;
            if (DEBUG) {
                System.out.println(day);
                System.out.println(this.days);
            }
        } else {
            String s = "Year before " + BASE_YEAR;
            throw new InvalidParameterException(s); 
        }
    }

    public int[] getDate() {
        int days = this.days;
        if (DEBUG) System.out.println(days);

        int year = BASE_YEAR; 
        int decrement = daysInYear(year);
        while (days > decrement) {
            days -= decrement;
            decrement = daysInYear(++year);
        }
        if (DEBUG) System.out.println(days);

        int month = BASE_MONTH;
        decrement = daysInMonth(month, year);
        while (days > decrement) {
            days -= decrement;
            decrement = daysInMonth(++month, year);
        }
        if (DEBUG) System.out.println(days);

        int day = days;

        int[] result = new int[3];
        result[0] = month;
        result[1] = day;
        result[2] = year;

        return result;
    }

    public String getFormattedDate() {
        String[] months = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
                "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
        int[] fields = getDate();
        return String.format("%s %d, %d", months[fields[0] - 1], 
                fields[1], fields[2]); 
    }

    public void addDays(int increment) {
        this.days += increment;
    }

    private int calculateMonthDays(int month, int year) {
        int days = 0;

        for (int i = BASE_MONTH; i < month; i++) {
            days += daysInMonth(i, year);
        }

        return days;
    }

    private int calculateYearDays(int year) {
        int days = 0;

        for (int i = BASE_YEAR; i < year; i++) {
            days += daysInYear(i);
        }

        return days;
    }

    private int daysInMonth(int month, int year) {
        int[] days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

        if (month == 2) {
            if (daysInYear(year) > 365) {
                return days[month - 1] + 1;
            } 
        }

        return days[month - 1];
    }

    private int daysInYear(int year) {
        int days = 365;

        if ((year % 4) == 0) {
            if ((year % 100) == 0) {
                if ((year % 400) == 0) {
                    days++;
                }
            } else {
                days++;
            }
        }

        return days;
    }

    public static void main(String[] args) {
        Date date = new Date(6, 12, 2014);
        displayResult(date, 10);

        date = new Date(6, 12, 2014);
        displayResult(date, 20);

        date = new Date(12, 15, 2014);
        displayResult(date, 20);

        date = new Date(12, 15, 1955);
        displayResult(date, 30);

        date = new Date(12, 15, 1955);
        displayResult(date, -30);

        date = new Date(12, 15, 1955);
        displayResult(date, 16);

        date = new Date(12, 15, 1955);
        displayResult(date, 17);

        date = new Date(12, 15, 1955);
        displayResult(date, 80);

        date = new Date(12, 15, 1956);
        displayResult(date, 80);

        date = new Date(3, 5, 1957);
        displayResult(date, -80);

        date = new Date(3, 5, 1956);
        displayResult(date, -80);
    }

    private static void displayResult(Date date, int increment) {
        String sign = "";
        int display = 0;

        if (increment > 0) {
            sign = " + ";
            display = increment;
        } else {
            sign = " - ";
            display = -increment;
        }

        System.out.print(date.getFormattedDate() + sign +
                display + " days -> ");
        date.addDays(increment);
        System.out.println(date.getFormattedDate());
    }

}

这里有一些测试结果。

Jun 12, 2014 + 10 days -> Jun 22, 2014
Jun 12, 2014 + 20 days -> Jul 2, 2014
Dec 15, 2014 + 20 days -> Jan 4, 2015
Dec 15, 1955 + 30 days -> Jan 14, 1956
Dec 15, 1955 - 30 days -> Nov 15, 1955
Dec 15, 1955 + 16 days -> Dec 31, 1955
Dec 15, 1955 + 17 days -> Jan 1, 1956
Dec 15, 1955 + 80 days -> Mar 4, 1956
Dec 15, 1956 + 80 days -> Mar 5, 1957
Mar 5, 1957 - 80 days -> Dec 15, 1956
Mar 5, 1956 - 80 days -> Dec 16, 1955

使用相同的私有方法将日期转换为整数,并将整数转换为日期会有所帮助。 DEBUG 显示帮助我修复了其他错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 2018-06-25
    • 1970-01-01
    • 2013-09-05
    相关资源
    最近更新 更多