10-4

// 日付クラスDay【第4版】
import java.util.GregorianCalendar;
import static java.util.GregorianCalendar.*;
import java.util.Scanner;
public class Day {
  GregorianCalendar today = new GregorianCalendar();
  int year  = today.get(YEAR);  // 年
  int month = today.get(MONTH) + 1;  // 月
  int date  = today.get(DATE);  // 日
 
 //-- y年は閏年か? --//
 public static boolean isLeap(int y) {
  return y % 4 == 0 && y % 100 != 0 || y % 400 == 0;
 }
 //-- コンストラクタ --//
 public Day()                              { }
 public Day(int year)                      { if (year < 1) year = 1;this.year = year; }
 public Day(int year, int month)           { this(year); if (month < 1) month = 1;if (month > 12) month = 12;  this.month = month; }
 public Day(int year, int month, int date) { this(year, month); if (date < 1) date = 1; switch(month + 1){
   case 1:
   case 3:
   case 5:
   case 7:
   case 8:
   case 10:
   case 12:
   if (date > 31) date = 31;
   break;
   case 4:
   case 6:
   case 9:
   case 11:
   if (date > 30) date = 30;
   break;
   case 2:
   if (isLeap(year)) {if (date > 29) date = 29;}
    else {if (date > 28) date = 28;}
  }
        this.date = date; }
 public Day(Day d)                         { this(d.year, d.month, d.date); }
 //--- 年・月・日を取得 ---//
 public int getYear()  { return year; }  // 年を取得
 public int getMonth() { return month; } // 月を取得
 public int getDay()   { return date; }  // 日を取得
 //--- 年・月・日を設定 ---//
 public void setYear(int year)   { this.year  = year; } // 年を設定
 public void setMonth(int month) { this.month = month; } // 月を設定
 public void setDate(int date)   { this.date  = date; } // 日を設定
 public void set(int year, int month, int date) {   // 年月日
  this.year  = year;   // 年 
  this.month = month;   // 月
  this.date  = date;   // 日
 }
 //-- 閏年か? --//
 public boolean isLeap() { return isLeap(year); }
 //--- 曜日を求める ---//
 public int dayOfWeek() {
  int y = year;     // 0 … 日曜日
  int m = month;     // 1 … 月曜日
  if (m == 1 || m == 2) {  //  :
   y--;       // 5 … 金曜日
   m += 12;      // 6 … 土曜日
  }
  return (y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + date) % 7;
 }
 //--- 日付dと等しいか ---//
 public boolean equalTo(Day d) {
  return year == d.year && month == d.month && date == d.date;
 }
 //--- 文字列表現を返却 ---//
 public String toString() {
  String wd = {"日", "月", "火", "水", "木", "金", "土"};
  return String.format("%04d年%02d月%02d日(%s)",
          year, month, date, wd[dayOfWeek()]);
 }
 //--- 今年の日数を計算 ---//
       public int Daycounter (int month, int date) {
 int day = 0;
        for( int j = 1; j < month ; j++ ){
       if ( j == 1 || j == 3 || j == 5 || j == 7 || j == 8 || j == 10 || j == 12 )
            day += 31;
       else if ( j == 4 || j == 6 || j == 9 || j == 11 )
            day += 30;
       else if ( j == 2 ) {
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0 )
            day += 29;
        else
            day += 28;
        }
     } 
 day += date;
 return day;}
 //--- 今年の残り日数を計算 ---//
 public int DayLeft (int year, int month, int date) {
 int day;
 if (isLeap(year)) return 366 - Daycounter(month, date);
  else   return 365 - Daycounter(month, date);
}
}

class DayTester {
 public static void main(String args) {
  Scanner stdIn = new Scanner(System.in);
  System.out.println("day1を入力せよ。");
  System.out.print("年:");  int y = stdIn.nextInt();
  System.out.print("月:");  int m = stdIn.nextInt();
  System.out.print("日:");  int d = stdIn.nextInt();
  Day day1 = new Day(y, m, d); // 読み込んだ日付
  System.out.println("day1 = " + day1);

  Day d1 = new Day();      //    1年 1月 1日
  Day d2 = new Day(2010);     // 2010年 1月 1日
  Day d3 = new Day(2010, 13);  
  Day d4 = new Day(2010, 0, 32);  // 2010年10月15日
  System.out.println("d1   = " + d1);
  System.out.println("d2   = " + d2);
  System.out.println("d3   = " + d3);
  System.out.println("d4   = " + d4);
  Day[] a = new Day[3];   // 要素数3のDay型配列
  for (int i = 0; i < a.length; i++)
   a[i] = new Day();    
  for (int i = 0; i < a.length; i++)
   System.out.println("a[" + i + "] = " + a[i]);

  System.out.println(y + "年は今日で" + (Day.Daycounter(m, d) + 1)+ "日目です。");
  System.out.println(y + "年は残り" + Day.DayLeft(y, m, d) + "日です。");
 }
}