2011-07-17 23 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/0001作为星期六。 但是对于其他最近的日期(比如17/7/2011),他们正在给出正确的答案(如星期天)。

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

但我怀疑我的计算从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将为0天(0日以来基准日),这又意味着0001-12-31您proleptic公历将是364,而不是365

您可以通过以下两种方法之一来调整:

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

与逆向工程的另一个问题历史可以追溯到远在理解“proleptic”公历。这个术语严格意味着“事物在其实际存在或已经存在之前已经存在”的表示,并且向前适用,但是该术语也用于日历计算中,指的是及时向后适用现行规则。现在的问题在于,第1年不存在闰年规则的公历(可以被400整除,也可以被4整除,但不能被100整除)。问题是:您提到的网站是否提供补偿朱利安历和格里高利之间的转换?(标的是很多并发症;日历格外不稳定,甚至在罗马帝国时期,约公元前55和200之间CE)


的优秀图书的最新考虑的问题是Calendrical Calculations

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 

这似乎与该网站同意...

相关问题