是否正确将01/01/0001日期视为星期一?

时间:2011-07-17 05:03:26

标签: java calendar julian-date

我正在编写一个程序来显示给定日期的日期。 (例如,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。 但是对于最近的其他日期(比如17/7/2011),他们仍然给出了正确答案(如周日)。

我猜这些滞后是由于Julier系统迁移到格里高利系统。

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

另外,我怀疑01/01/0001日期是星期一还是星期六。 (如果我把星期六作为我的第一天,我得到了错误的答案。)

有人请解释。

提前致谢。

2 个答案:

答案 0 :(得分: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

这似乎与网站一致...

答案 1 :(得分:0)

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

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。

逆向工程的另一个问题可以追溯到目前为止正在理解“预感”格里高利历。该术语严格意味着“事物在实际上或之前存在的事物的表示”,并向前应用,但该术语也用于日历计算中,指的是及时应用现有规则。手头的问题是,第一年不存在具有闰年规则的公历(可被400整除,或者可被4整除但不能被100整除)。问题是:您提到的网站是否补偿?在朱利安历法和格里高利之间切换? (这是很多复杂的基础;即使在罗马帝国,公元前55年到公元200年之间,日历也异常不稳定。)


考虑约会问题的优秀书籍是Calendrical Calculations