我正在编写一个程序来显示给定日期的日期。 (例如,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日期是星期一还是星期六。 (如果我把星期六作为我的第一天,我得到了错误的答案。)
有人请解释。提前致谢。
答案 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.
您可以通过以下两种方式之一进行调整:
逆向工程的另一个问题可以追溯到目前为止正在理解“预感”格里高利历。该术语严格意味着“事物在实际上或之前存在的事物的表示”,并向前应用,但该术语也用于日历计算中,指的是及时应用现有规则。手头的问题是,第一年不存在具有闰年规则的公历(可被400整除,或者可被4整除但不能被100整除)。问题是:您提到的网站是否补偿?在朱利安历法和格里高利之间切换? (这是很多复杂的基础;即使在罗马帝国,公元前55年到公元200年之间,日历也异常不稳定。)
考虑约会问题的优秀书籍是Calendrical Calculations。