달력을 출력하기에 앞서
굉장히 시간이 오래걸리고 많이 찾아본 코드이다.
윤년을 계산해야하고
달마다 마지막 날짜가 다르며
정확한 값을 입력했는지도 확인해야 한다.
.
.
package ex8;
import java.util.*;
public class Date {
private int day, month, year;
private int[] MAX_DAYS = new int[] {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 평년
private int[] LEAP_MAX_DAYS = new int[] {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 윤년
public Date(int year, int month, int day) {
this.day = day;
this.month = month;
this.year = year;
}
public Date() { } // default 생성자 - printCalader 이용
public int getDay() { return day; }
public void setDay(int day) { this.day = day; }
public int getMonth() { return month; }
public void setMonth(int month) { this.month = month; }
public int getYear() { return year; }
public void setYear(int year) { this.year = year; }
public void getDate(int year, int month, int day) {}
public void printCalander() {
int calYear, calMonth;
Scanner sc = new Scanner(System.in);
System.out.print("연도를 입력해주세요.");
calYear = sc.nextInt();
System.out.print("월을 입력해주세요.");
calMonth = sc.nextInt();
int firstDay = getDayOfWeek(calYear, calMonth, 1); // 첫째날 요일 계산
int lastDay = getMaxDayOfMonth(calYear, calMonth); // 마지막날 날짜 계산
System.out.printf("<<< %5d년 %4d월 >>>> \n", calYear, calMonth);
System.out.println(" SU MO TU WE TH FR SA");
System.out.println("---------------------");
// 첫 주 출력
int count = 7 - firstDay;
int delim = count < 7 ? count : 0;
for(int i=0; i< firstDay; i++){ // 첫 주 날짜 공백 출력
System.out.print(" ");
}
for(int i = 1; i <= count; i++) {
System.out.printf("%3d", i);
}
count++;
System.out.println();
// 둘째 주부터 출력
for(int i=count ; i <= lastDay; i++){
System.out.printf("%3d", i);
if(i % 7 == delim){
System.out.println();
}
}
System.out.println();
}
// 평년과 윤년을 계산하여 마지막 날짜 출력 메소드
public int getMaxDayOfMonth(int year, int month){
if(isLeapYear(year)){
return LEAP_MAX_DAYS[month -1];
}else{
return MAX_DAYS[month-1];
}
}
// 윤년 검사
public boolean isLeapYear() {
if((year / 4 == 0 && year / 100 != 0) || year / 400 == 0) {
System.out.println("윤년입니다.");
return true;
}
else {
System.out.println("윤년이 아닙니다.");
return false;
}
}
public boolean isLeapYear(int year) {
if((year / 4 == 0 && year / 100 != 0) || year / 400 == 0) {
System.out.println("윤년입니다.");
return true;
}
else {
System.out.println("윤년이 아닙니다.");
return false;
}
}
public boolean isValidDate() {
if(year >= 1 && year <= 9999) {
if(month >= 1 && month <= 12) {
if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
if(day < 1 || day > 31) {
System.out.println("정확한 날짜를 입력해주세요.(1~31)");
return false;
}else {
return true;
}
}else if(month == 4 || month == 6 || month == 9 || month == 11) {
if(day < 1 || day > 30) {
System.out.println("정확한 날짜를 입력해주세요.(1~30)");
return false;
}else {
return true;
}
}else if(month == 2) {
if(isLeapYear()) {
if(day < 1 || day > 29) {
System.out.println("정확한 날짜를 입력해주세요.(1~29)");
return false;
}
else {
return true;
}
}else if(!isLeapYear()){
if(day < 1 || day > 28) {
System.out.println("정확한 날짜를 입력해주세요.(1~28))");
return false;
}else {
return true;
}
}
}
}else {
System.out.println("정확한 월을 입력해주세요.(1~12)");
return false;
}
}else {
System.out.println("정확한 연도를 입력해주세요.(1~9999)");
return false;
}
return true;
}
public int getDayOfWeek() {
int yearNum1 = 0, yearNum2 = 0, monthNum = 0;
if((year >= 1700 && year < 1800) || (year >= 2100 && year < 2200)) {
yearNum1 = 4;
yearNum2 = year % 100;
}
else if((year >= 1800 && year < 1900) || (year >= 2200 && year < 2300) ) {
yearNum1 = 2;
yearNum2 = year % 100;
}
else if((year >= 1900 && year < 2000) || (year >= 2300 && year < 2400)) {
yearNum1 = 0;
yearNum2 = year % 100;
}
else if((year >= 2000 && year < 2100) || (year >= 2400 && year < 2500)) {
yearNum1 = 6;
yearNum2 = year % 100;
}else {
System.out.println("유효하지 않은 년도 입니다.");
}
if(isLeapYear()) {
switch(month) {
case 10 :
monthNum = 0; break;
case 3 : case 11 :
monthNum = 3; break;
case 1 : case 4 : case 7 :
monthNum = 6; break;
case 5 :
monthNum = 1; break;
case 6 :
monthNum = 4; break;
case 2 : case 8 :
monthNum = 2; break;
case 9 : case 12 :
monthNum = 5; break;
}
}else {
switch(month) {
case 1 : case 10 :
monthNum = 0; break;
case 2 : case 3 : case 11 :
monthNum = 3; break;
case 4 : case 7 :
monthNum = 6; break;
case 5 :
monthNum = 1; break;
case 6 :
monthNum = 4; break;
case 8 :
monthNum = 2; break;
case 9 : case 12 :
monthNum = 5; break;
}
}
return (yearNum1 + yearNum2 + (yearNum2 / 4) + monthNum + day) % 7;
// 0 일요일, 1 월요일, 2 화요일, 3 수요일, 4 목요일, 5 금요일, 6 토요일
}
public int getDayOfWeek(int year, int month, int day) {
int yearNum1 = 0, yearNum2 = 0, monthNum = 0;
if((year >= 1700 && year < 1800) || (year >= 2100 && year < 2200)) {
yearNum1 = 4;
yearNum2 = year % 100;
}
else if((year >= 1800 && year < 1900) || (year >= 2200 && year < 2300) ) {
yearNum1 = 2;
yearNum2 = year % 100;
}
else if((year >= 1900 && year < 2000) || (year >= 2300 && year < 2400)) {
yearNum1 = 0;
yearNum2 = year % 100;
}
else if((year >= 2000 && year < 2100) || (year >= 2400 && year < 2500)) {
yearNum1 = 6;
yearNum2 = year % 100;
}else {
System.out.println("유효하지 않은 년도 입니다.");
}
if(isLeapYear()) {
switch(month) {
case 10 :
monthNum = 0; break;
case 3 : case 11 :
monthNum = 3; break;
case 1 : case 4 : case 7 :
monthNum = 6; break;
case 5 :
monthNum = 1; break;
case 6 :
monthNum = 4; break;
case 2 : case 8 :
monthNum = 2; break;
case 9 : case 12 :
monthNum = 5; break;
}
}else {
switch(month) {
case 1 : case 10 :
monthNum = 0; break;
case 2 : case 3 : case 11 :
monthNum = 3; break;
case 4 : case 7 :
monthNum = 6; break;
case 5 :
monthNum = 1; break;
case 6 :
monthNum = 4; break;
case 8 :
monthNum = 2; break;
case 9 : case 12 :
monthNum = 5; break;
}
}
return (yearNum1 + yearNum2 + (yearNum2 / 4) + monthNum + day) % 7;
// 0 일요일, 1 월요일, 2 화요일, 3 수요일, 4 목요일, 5 금요일, 6 토요일
}
public String toString() {
String dd, mm, yyyy;
if(day < 10) {dd = "0" + Integer.toString(day);}
else {dd = Integer.toString(day);}
if(month < 10) {mm = "0" + Integer.toString(month);}
else {mm = Integer.toString(month);}
yyyy = Integer.toString(year);
return dd + "/" + mm + "/" + yyyy;
}
public String toString(Date d) {
String sentence = "";
if(isValidDate()) {
switch(getDayOfWeek()) {
case 0 :
sentence += d.year + "년 " + d.month + "월 " + d.day + "일 " + "일요일"; break;
case 1 :
sentence += d.year + "년 " + d.month + "월 " + d.day + "일 " + "월요일"; break;
case 2 :
sentence += d.year + "년 " + d.month + "월 " + d.day + "일 " + "화요일"; break;
case 3 :
sentence += d.year + "년 " + d.month + "월 " + d.day + "일 " + "수요일"; break;
case 4 :
sentence += d.year + "년 " + d.month + "월 " + d.day + "일 " + "목요일"; break;
case 5 :
sentence += d.year + "년 " + d.month + "월 " + d.day + "일 " + "금요일"; break;
case 6 :
sentence += d.year + "년 " + d.month + "월 " + d.day + "일 " + "토요일"; break;
}
}
return sentence;
}
}
.
.
일단 전체 코드를 적어놓고 세분화 해야할거같다.
.
.
package ex8;
public class TestDate {
public static void main(String[] args) {
Date date1 = new Date(2020, 3, 21);
System.out.println(date1);
System.out.println(date1.toString(date1));
Date date_test = new Date();
date_test.printCalander(); // 스캐너로 입력받아 실행한다.
//date1.printCalander();
}
}
728x90
반응형
'Java > 본격 Java 퀴즈 기초' 카테고리의 다른 글
[Java] 달력 출력하기 - 지정한 날짜 요일 확인하기 (0) | 2020.07.08 |
---|---|
[Java] 달력 출력하기 - 윤년 확인하기 (0) | 2020.07.08 |
[Java] 계좌 운영하기 (0) | 2020.07.08 |
[Java] 책 정보 입력 (0) | 2020.07.08 |
[Java] 영수증 출력 (0) | 2020.07.08 |