为SmartDate添加一个方法dayOfTheWeek(),为日期中每周的日返回Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday中的适当值。你可以假定时间是21世纪。
/**
* Description :
* Author : mn@furzoom.com
* Date : Sep 27, 2016 9:45:00 AM
* Copyright (c) 2013-2016, http://furzoom.com All Rights Reserved.
*/
package com.furzoom.lab.algs.ch102;
class SmartDate
{
private final int month;
private final int day;
private final int year;
private final int[] months =
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
private final int[] days =
{0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
private final int[] daysLeap =
{0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335};
private final String[] weekdays = {"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"};
public SmartDate(int m, int d, int y)
{
if (!validate(m, d, y))
throw new IllegalArgumentException("Argument illegal " + m + "/" + d + "/" + y);
this.month = m;
this.day = d;
this.year = y;
}
public int month()
{
return month;
}
public int day()
{
return day;
}
public int year()
{
return year;
}
public String dayOfTheWeek()
{
// based on 1/1/2000
int totalDays;
if (isLeapYear())
{
totalDays = daysLeap[month] + day;
}
else
{
totalDays = days[month] + day;
}
for (int i = 2000; i < year; i++)
{
if (isLeapYear(i))
totalDays += 366;
else
totalDays += 365;
}
// 1/1/2000 is Saturday
return weekdays[((totalDays - 1) % 7 + 6) % 7];
}
public String toString()
{
return month + "/" + day + "/" + year;
}
private boolean validate(int m, int d, int y)
{
if (y == 0 || y < -1000 || y > 10000)
return false;
if (m < 1 || m > 12)
return false;
if (d < 1 || d > 31)
return false;
if (d > months[m])
return false;
if (!isLeapYear() && d > 28)
return false;
return true;
}
private boolean isLeapYear(int y)
{
if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
{
return true;
}
else
{
return false;
}
}
private boolean isLeapYear()
{
return isLeapYear(year);
}
}测试:
/**
* Description :
* Author : mn@furzoom.com
* Date : Sep 27, 2016 9:42:39 AM
* Copyright (c) 2013-2016, http://furzoom.com All Rights Reserved.
*/
package com.furzoom.lab.algs.ch102;
/**
* ClassName : E10212 <br>
* Function : TODO ADD FUNCTION. <br>
* date : Sep 27, 2016 9:42:39 AM <br>
*
* @version
*/
public class E10212
{
public static void main(String[] args)
{
SmartDate date = new SmartDate(1, 1, 2000);
System.out.println(date + " " + date.dayOfTheWeek());
date = new SmartDate(2, 1, 2000);
System.out.println(date + " " + date.dayOfTheWeek());
date = new SmartDate(12, 29, 2000);
System.out.println(date + " " + date.dayOfTheWeek());
date = new SmartDate(12, 29, 2010);
System.out.println(date + " " + date.dayOfTheWeek());
}
}
结果:
1/1/2000 Saturday 2/1/2000 Tuesday 12/29/2000 Friday 12/29/2010 Wednesday