Правильно ли принимать 01.01.0001 дату как понедельник? - PullRequest
2 голосов
/ 17 июля 2011

Я пишу программу для отображения Дня для данной даты. (Например, четверг на 1 января 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/01/0001 за понедельник и рассчитываю остальные дни. И я получаю правильные ответы.

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 17 июля 2011

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

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) не существовал в 1-м году. И вопрос в том: компенсируют ли упомянутые вами сайты компенсацию? для переключения между юлианским календарем и григорианским? (В основе этого лежит множество осложнений; календарь был чрезвычайно изменчив, даже в Римской империи, между 55 г. до н.э. и 200 г. н.э.)


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

0 голосов
/ 17 июля 2011

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

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

...