2011-07-17 2 views
2

주어진 날짜의 요일을 표시하는 프로그램을 작성 중입니다. 예 : 목요일 (1970 년 1 월 1 일 목요일) 시도 할 때 몇 가지 문제가 있습니다.01/01/0001 날짜를 월요일로 사용하는 것이 맞습니까?

이것은 내 프로그램입니다.

/*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/01을 사용했습니다. 그러나 최근 다른 날짜 (2011 년 7 월 17 일)에 대해서는 (일요일과 같이) 정답을 제공하고 있습니다.

이러한 지연은 줄리어 시스템이 그레고리 안 시스템으로 마이그레이션 되었기 때문에 발생할 수 있습니다.

그러나 0001 년에서의 일 계산 방식이 맞는지 여부는 의심 스럽습니다.

또한 01/01/0001 날짜를 월요일 또는 토요일으로 가져갈 지에 대한 의문이 있습니다. (토요일에 첫날로 토요일을 보내면 잘못된 답변이 나옵니다.)

누군가를 설명하십시오.

미리 감사드립니다. 당신은 항상 자바 자체가 당신을 제공 무엇에 비교할 수

+0

숙제 태그를 잊어 버렸습니다 ... –

+0

사용중인 프로그래밍 언어에 대한 태그도 잊어 버렸습니다. –

답변

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 차례로 귀하의 예 기적 그레고리 안 달력에 0001-12-31가 없습니다, 365

364 수 있다는 것을 의미 일 0 (0 경과 일수 기준 날짜) 될 것이라고 말한다 당신은 두 가지 방법 중 하나로이를 조정할 수 있습니다

  • 은 0001-01-01 하루 1이됩니다 정의 (주석의 인용 조각의 나머지가 올바른지 그러자).
  • 변경 주석 (364)에 대한 값과 730

리버스 엔지니어링의 또 다른 문제는 다시 그까지 '예 기적'그레고리력을 이해하는 거슬러 올라간다. 이 용어는 엄격하게 '실제로 존재하거나 그렇게하기 전에 존재하는 것의 표현'을 의미하며 앞으로 적용되지만이 용어는 현행 규칙을 거꾸로 적용하는 것을 가리키는 달력 적 계산에도 사용됩니다. 현재의 문제는 1 년 내에 윤년 규칙 (400으로 나눌 수 있거나 4로 나눌 수 있지만 100으로 나눌 수 없음)이없는 그레고리력이 존재하지 않는다는 것입니다. 문제는 다음과 같습니다. 참조한 웹 사이트가 보상 했습니까? 율리우스 력과 그레고리력 사이의 전환을 위해서?(합병증이 많이 있습니다 근본적인 것을;. 달력이 약 55 BCE 200 CE 사이에, 심지어는 로마 제국에, 매우 휘발성이었다)이 날짜의 문제를 고려하기위한


훌륭한 책 는 Calendrical Calculations입니다.

0

는 :

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 

...