4

我正在编写一个程序来显示给定日期的日期。(例如 1970 年 1 月 1 日的星期四。)在尝试时,我遇到了一些问题。

这是我的程序。

/*Concept: 
 The noOfDays variable will count the no of days since 01/01/0001. And this will be Day one(1). E.g 
 noOfDays = 365 for 01/12/0001 and noOfDays = 731 for 01/01/0003 and so on....
 Since I taken Monday as 01/01/0001,the day of the specific date can be achieved by switching(noOfDays%7)
 E.g. 365 % 7 = 1. So, the 365th day is monday...
*/

import java.util.Scanner;
class DayDisplayer
{
    long noOfDays;
    int month;
    int days;
    int year;
    Scanner scan;
    int countYear;
    int countMonth;

    DayDisplayer()
    {
        scan = new Scanner(System.in);
        noOfDays = 0;
        System.out.println("Enter the date please");

        days = scan.nextInt();
        month = scan.nextInt();
        year = scan.nextInt();

        System.out.println("Your Date is:  "+days+"/"+month+"/"+year);



    }

    boolean leapYearCheck(int year)
    {
        if( ((year%100 == 0) && (year%400 != 0)) || (year%4 != 0) )  // when it is divisible by 100 and not by 400.  
            return false;
        else
            return true;

    }

    boolean isThere31Days()
    {
        if ( ( (countMonth >> 3) ^ (countMonth & 1) ) == 1 ) 
            return true;
        else 
            return false;

    }

    void getDaysThatInDays()    
    {
        noOfDays += days;
    }

    void getDaysThatInMonth()
    {

        countMonth = 1;

        while(countMonth<month)
        {
            if( countMonth == 2 )
                if( leapYearCheck(year) == true)
                    noOfDays += 29;
                else 
                    noOfDays += 28;
            else
               if ( isThere31Days()) 
                   noOfDays += 31;
               else 
                   noOfDays += 30;

            countMonth++;
        }                   



    }

    void getDaysThatInYear()
    {
        countYear = 1;

        while(countYear<year)
        {
            if( leapYearCheck(countYear)== true )  
                    noOfDays += 366; 
                else 
                    noOfDays += 365;

            countYear ++;
        }
    }

    void noOfDaysAndDayName()
    {
        System.out.println("The noOfDays is"+noOfDays);

        System.out.println("And Your Day is :"); 

        int day;

        day = (int)(noOfDays%7);
        switch(day)
        {

        case 0:
            System.out.println("Sunday");
            break;
        case 1:
            System.out.println("Monday");
            break;
        case 2:
            System.out.println("Tuesday");
            break; 
        case 3:
            System.out.println("Wednesday");
            break;
        case 4:
            System.out.println("Thursday");
            break;
        case 5:
            System.out.println("Friday");
            break;
        case 6:
            System.out.println("Saturday");
            break;
        }

    }

}// end of MonthToDate class

public class Main
{
    public static void main(String args[])
    {

        DayDisplayer  dd= new DayDisplayer();

        dd.getDaysThatInYear();
        dd.getDaysThatInMonth();
        dd.getDaysThatInDays();

        dd.noOfDaysAndDayName();


    }



}

在这段代码中,当我将 01/01/0001 作为星期一并计算其他日子时。我得到了正确的答案。

但是在 www.timeanddate.com网站上,他们将 01/01/0001 作为星期六。但对于最近的其他日期(比如 2011 年 7 月 17 日),他们仍然给出了正确的答案(如星期日)。

我可以猜测这些滞后是由于 Julier 系统迁移到 Gregorian 系统。

但是我怀疑我从 0001 年计算天数的方法是否正确?

我也有疑问是否采取 01/01/0001 日期是星期一或星期六。(如果我把星期六作为我的第一天,我会得到错误的答案。)

有人请解释一下。

提前致谢。

4

2 回答 2

1

您的开场评论中的一个错误可能会突出显示一个问题:

The noOfDays variable will count the no of days since 01/01/0001. E.g 
noOfDays = 365 for 01/12/0001 and noOfDays = 731 for 01/01/0003 and so on.

这表示 0001-01-01 将是第 0 天(自参考日期起 0 天),这反过来意味着您的预测公历上的 0001-12-31 将是 364,而不是 365。

您可以通过以下两种方式之一进行调整:

  • 定义 0001-01-01 将是第 1 天(因此引用的评论片段的其余部分是正确的)。
  • 将注释值更改为 364 和 730。

Another problem with reverse engineering dates back that far is understanding the 'proleptic' Gregorian calendar. The term strictly means 'the representation of a thing as existing before it actually does or did so', and applies forward, but the term is also used in calendrical calculations to refer to applying the present rules backwards in time. The issue at hand is that the Gregorian calendar with its rules for leap years (divisible by 400, or divisible by 4 but not divisible by 100) did not exist in year 1. And the question is: did the web sites you referred to compensate for the switch between the Julian calendar and the Gregorian? (Underlying that are a lot of complications; the calendar was exceptionally volatile, even in the Roman Empire, between about 55 BCE and 200 CE.)


Calendrical Calculations是一本考虑日期问题的优秀书籍。

于 2011-07-17T14:16:53.437 回答
0

你总是可以比较 Java 本身给你的东西:

import java.util.Scanner;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.text.FieldPosition;

public class Test {

    public static void main (String args[]) {
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter the date please");

        int days = scan.nextInt();
        int month = scan.nextInt();
        int year = scan.nextInt();

        SimpleDateFormat sdf = new SimpleDateFormat("E dd-MM-yyyy G");
        StringBuffer buf = new StringBuffer();
        Calendar cal = new GregorianCalendar();
        cal.set(year, month-1, days);
        sdf.format(cal.getTime(), buf, new FieldPosition(0));
        System.out.println(buf.toString());

    }


}

所以我们得到:

> java Test
Enter the date please
1
1
0001
Sat 01-01-0001 AD

这似乎与网站一致......

于 2011-07-17T08:52:07.327 回答