Правильно ли принимать 01.01.0001 дату как понедельник?

Я пишу программу для отображения дня для данной даты. (Например, четверг на 01.01.1970 г.) При попытке у меня возникли некоторые проблемы.

Это моя программа.

/*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.010001 за понедельник и подсчитываю остальные дни. И я получаю правильные ответы.

Но на сайте http://www.timeanddate.com/calendar/ они приняли 01/01/0001 как субботу. Но все же на другие недавние даты (скажем, 17/7/2011) они дают правильный ответ (как в воскресенье).

Я могу предположить, что эти лаги связаны с миграцией системы Джульера в григорианскую систему.

Но у меня есть сомнения в правильности моего подхода к расчету Дней с 0001 года?

Также у меня есть сомнения относительно того, принимать ли 01/01/0001 дату в понедельник или субботу. (И если я выбрал субботу в качестве первого дня, я получаю неправильные ответы.)

кто-то, пожалуйста, объясните.

Заранее спасибо.

2 ответа

Решение

Одна проблема может быть подчеркнута ошибкой в ​​вашем первом комментарии:

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 г. н.э.)


Отличная книга для рассмотрения актуальных вопросов - " Календарные расчеты".

Вы всегда можете сравнить с тем, что дает сама 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

который, кажется, согласен с сайтом...

Другие вопросы по тегам