Bibi's DevLog ๐ค๐
[Java] ๋ฌ๋ ฅ ๋ง๋ค๊ธฐ - ํ์ฌ ๋ ์ง ๋ฐ ํน์ ๋ ์ง ๋ฌ๋ ฅ ์ถ๋ ฅ. (Calendar, Date, SimpleDateFormat, ์ค๋ ) ๋ณธ๋ฌธ
๐ฅ BE ๋ฐฑ์๋/Java ์๋ฐ
[Java] ๋ฌ๋ ฅ ๋ง๋ค๊ธฐ - ํ์ฌ ๋ ์ง ๋ฐ ํน์ ๋ ์ง ๋ฌ๋ ฅ ์ถ๋ ฅ. (Calendar, Date, SimpleDateFormat, ์ค๋ )
๋น๋น bibi 2020. 11. 18. 19:11์๋ฐ๋ก ๋ฌ๋ ฅ์ ๋ง๋ค๊ณ ์ถ๋ ฅํ๋ ์์ ์ ๋๋ค.
์ถ๋ ฅํํ
ํด๋์ค : MyCalendar
(ํด๋์ค๋ช ์ Calendar๋ก ํ๋๋ Calendarํด๋์ค๋ฅผ ์ํฌํธํ ๋ ์๋ฌ๊ฐ ๋์ ๋ฐ๊ฟจ๋ค)
starter()
- ๋ฌ๋ ฅ์ ์คํํ๋ ๋ฉ์๋
- a๋ฅผ ์ ๋ ฅํด buildCurrendCalendar()๋ฅผ ์คํ, ํ์ฌ ๋ฌ๋ ฅ์ ์ถ๋ ฅ.
- z๋ฅผ ์ ๋ ฅํด getYear(),getMonth()๋ฅผ ์คํํ๊ณ ์ ๋ ฅ๊ฐ์ ๋ฐ์ buildPastCalendar()๋ฅผ ์คํ
- ์๋ชป ์ ๋ ฅ์ starter()๋ฅผ ๋ฐ๋ณต์คํ
getYear(), getMonth()
- ์ฐ๋ / ์ ์ ๋ฐ์์ค๋ ๋ฉ์๋. ๊ณผ๊ฑฐ ๋ฌ๋ ฅ ์ถ๋ ฅํ ๋๋ง ์คํ๋จ.
- ๋ ๋ค ์์ฐ์๋ฅผ ์ ๋ ฅํด์ผ ํ๋ฉฐ ์์ 1-12์ฌ์ด ์์ฐ์๋ง ์ ๋ ฅ ๊ฐ๋ฅ.
getCurrent()
- ํ์ฌ ์ฐ์์ ๊ฐ์ ธ์ค๋ ๋ฉ์๋. ํ์ฌ ๋ฌ๋ ฅ ์ถ๋ ฅํ ๋๋ง ์คํ๋จ.
- Calendarํด๋์ค๋ฅผ ํตํด ํ์ฌ ์ฐ๋์ ํ์ฌ ์์ ๊ฐ์ ธ์จ๋ค
- โ Calendarํด๋์ค๋ฅผ ํตํด ํ์ฌ ์์ ๊ฐ์ ธ์ฌ ๋๋ +1 ์ ํด ์ค์ผ ํ๋ค. 1์์ 0์ผ๋ก, 12์์ 11๋ก ์กฐํ๋๊ธฐ ๋๋ฌธ.
isLeapYear(int year)
- ์ค๋ ์ ์ฒดํฌํ๋ ๋ฉ์๋. ํ์ฌ ๋ฌ๋ ฅ, ๊ณผ๊ฑฐ ๋ฌ๋ ฅ ๋ชจ๋ ์คํ๋จ.
- ์ค๋
= ์ฐ๋๊ฐ 4์ ๋ฐฐ์์ด๋ฉด์, 100์ ๋ฐฐ์๊ฐ ์๋๊ฑฐ๋ 400์ ๋ฐฐ์์ผ ๋ ์ค๋
์ด๋ค.
- ์ฆ 1. 4์ ๋ฐฐ์์ด์ง๋ง 100์ ๋ฐฐ์๋ ์๋ ์ฐ๋, 2. 4์ ๋ฐฐ์์ด๋ฉด์ 400์ ๋ฐฐ์์ธ ์ฐ๋ ๊ฐ ์ค๋ ์ ํด๋นํ๋ค.
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
๋ก ๊ฒ์ฌํด ์ค๋ ์ด๋ฉด true, ์๋๋ฉด false ๋ฐํ.
calMonth1stDayWeek(int year, int month)
- ์ด๋ค ์์ '1์ผ'์ ์์ผ์ ๊ตฌํ๋ ๋ฉ์๋.
- ๋๋ 1์ผ์ ์์ผ์ ๊ตฌํ๊ณ , ๊ทธ ์์ผ๋ถํฐ 1~๋ง์ง๋ง๋ ๊น์ง ์ถ๋ ฅํ๋ ๋ฐฉ์์ผ๋ก ๋ฌ๋ ฅ์ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ 1์ผ์ ์์ผ์ ๊ตฌํ๋ ๊ฒ์ด ๊ต์ฅํ ์ค์ํ๋ค. (๊ทธ๋์ ๋ฉ์๋๋ช ์ด ๋ณต์กํ ๊ฑด ์๋๋ค. ํํ..)
- ์ํฌํธํ๋ Calendarํด๋์ค์ Dateํด๋์ค๋ฅผ ๊ฐ๊ฐ ๋ถ๋ฌ์จ๋ค
- YMD = ๋งค๊ฐ๋ณ์๋ก ๋ฐ์์จ year์ month์ "-01"์ ์ด์ด๋ถ์ฌ "yyyy-MM-01"ํํ๋ก ๋ง๋ ๋ค
- ๊ณผ๊ฑฐ ๋ฌ๋ ฅ์ ๋งค๊ฐ๋ณ์๊ฐ getYear(), getMonth()์ ๋ฆฌํด๊ฐ์ด๋ฉฐ
- ํ์ฌ ๋ฌ๋ ฅ์ ๋งค๊ฐ๋ณ์๊ฐ getCurrent()์ ๋ฆฌํด๊ฐ์ด๋ค.
- ํ์ธ์ ์ํด ์ค๋ ๋ ์ง๋ฅผ ํ๋ฒ ์ถ๋ ฅํด ์ค๋ค
- try-catch๋ฅผ ์ด ์ด์ ๋
calendar.setTime(formatter.parse(YMD));
๋ถ๋ถ์์ parse์ ๋ํ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ ๊ทธ๋ฐ์ง๋ ๋์ค์ ๋ ๊ณต๋ถํด์ผ๊ฒ ๋ค (ParseException) calendar.get(Calendar.DAY_OF_WEEK);
์ ํตํด ๋์จ ๊ฒฐ๊ณผ๊ฐ์ 1์ด ์ผ์์ผ, 2๊ฐ ์์์ผ .. 7์ด ํ ์์ผ ์ด๋ค.
buildCurrentCalendar()
-
ํ์ฌ ๋ ์ง์ ๋ฌ๋ ฅ์ ๋ง๋๋ ๋ฉ์๋.
-
- ์ฐ, ์ ) getCurrent()์์ ๋ฐ์์จ๋ค
-
- ์์ ์ต๋์ผ)
- ์ต๋์ผ์ธ dayMax๋ ๊ฐ ์์ ๋ํ ๋ง์ง๋ง ์ผ์๋ฅผ ๋ด์ ๋์ ๋ฐฐ์ด์ธ dayData ๋๋ dayDataLeapYear์์ ๊บผ๋ด ์ด๋ค.
- dayDataLeapYear์ 2์์ ํด๋นํ๋ ์ผ์๊ฐ 29๋ก ๋์ด ์๋ค.
- ๊บผ๋ด ์ธ ๋ isLeapYear()์ ๊ฒฐ๊ณผ๊ฐ์ด true์ด๊ณ , 2์์ผ ๋๋ง dayDataLeapYear์์ ๊บผ๋ด์ฐ๋๋ก ํ๋ค.
- (๊บผ๋ด ์ธ ๋๋ ์ธ๋ฑ์ค๊ฐ์ ์-1์ ํด์ผ ํ๋ค : 1์์ 0๋ฒ์งธ, 2์์ 1๋ฒ์งธ.. ์ ๋ค์ด์๊ธฐ ๋๋ฌธ)
-
- ์์ 1์ผ์ ์์ผ ) calMonth1stDayWeek(year,month) ๋ก ์ฐ, ์์ ๋ณด๋ด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์จ๋ค
-
- ์ฐ, ์, ์ต๋์ผ, ์์ 1์ผ์ ์์ผ์ ๊ฐ์ง๊ณ printCalendar() ์์ ์ถ๋ ฅํ๊ฒ ํ๋ค.
buildPastCalendar(int year, int month)
-
๊ณผ๊ฑฐ ๋ ์ง์ ๋ฌ๋ ฅ์ ๋ง๋๋ ๋ฉ์๋.
-
- ์ฐ, ์ ) ๋ถ๋ถ์ ์ ์ธํ๊ณ ๋ buildCurrendCalendar()์ ๋๊ฐ๋ค.
- ๊ณผ๊ฑฐ ๋ ์ง์ ์ฐ, ์์ getYear(), getMonth()์์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์ฐ, ์์ ๋ฐ์์จ๋ค.
printCalendar(int year, int month, int dayMax, int dayWeek1)
- ์ฐ, ์, ์ต๋์ผ, ์์ 1์ผ์ ์์ผ ์ ๋ฐ์์์ ์ฝ์์ฐฝ์ ์ถ๋ ฅํ๋ ๋ฉ์๋
- ๋ฌ๋ ฅ์ ์ถ๋ ฅํ๋ ๋ฐ๋ ์ ๋ง ๋ค์ํ ๋ฐฉ์์ด ์์๋ค..
- "์๋ฐ ๋ฌ๋ ฅ ๋ง๋ค๊ธฐ"๋ก ๊ตฌ๊ธ๋งํ๋ฉด ๋ค์ํ ๋ฐฉ์์ด ๋์จ๋ค. ์ญ์ ์ด๊ฒ์ ๊ฒ ์ฐธ๊ณ ํ๋ฉฐ ๋ด๊ฐ ์ํ๋ ๋ฐฉ์๋๋ก ๋ง๋ฆ.
- ๊ตฌ๊ธ๋งํ ๋งํฌ1-์๋ฆฌ์ฆ, ๋งํฌ2, ๋งํฌ3 ๋ค. ๋ชจ๋๋ชจ๋ ๊ฐ์ฌํฉ๋๋ค๐โ๏ธ
- ๋ฌ๋ ฅ ์ถ๋ ฅ์๋ ๋ฐฐ์ด/์ด์ฐจ์๋ฐฐ์ด์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ทธ๋ ์ง ์์ ๊ฒ์ผ๋ก ํฌ๊ฒ ๋๋๋ ๊ฒ ๊ฐ์๋ค. ๋๋ ๋น ๋ ์ง์ ๊ณต๋ฐฑ์ ์ถ๊ฐํ๊ณ , ๋ฐ๋ณต๋ฌธ์ ์ข ๋ ํธํ๊ฒ ์ฐ๊ณ ์ถ์ด์ ๋ฐฐ์ด์ ์ฌ์ฉํ์ง ์์๋ค. (๋ฐฐ์ด ์ฌ์ฉํ๋ ค๋๊น ๋จธ๋ฆฌ๊ฐ ๋ณต์กํด์ ธ์๐ )
- ๋ฌ๋ ฅ ์ ๋ชฉ(yyyy๋ MM์) ๊ณผ ์ผ ์ ํ ์ ๋ชฉ ๊ธ ํ ๋ฅผ ์ถ๋ ฅํ๋ค.
- ๋ฌ๋ ฅ์ 1์ผ์ ์์ผ(dayWeek1) ์๋ถ๋ถ์ ์ฑ์ธ ๊ณต๋ฐฑ (๋๋ โจ) ์ ์ถ๋ ฅํ๋ค.
- dayWeek1 = 1 ์ด๋ฉด ์ผ์์ผ๋ถํฐ 1,2,3,4,5.. ๊ฐ ์ฑ์์ง๋ฏ๋ก ๊ณต๋ฐฑ์ 0์ด๋ค.
- dayWeek1 = 2 ์ด๋ฉด ์์์ผ๋ถํฐ 1,2,3,4.. ๊ฐ ์ฑ์์ง๋ฏ๋ก ๊ณต๋ฐฑ์ 1์ด๋ค.
- ์ฆ dayWeek1(1์ผ์ ์์ผ) -1 ๋งํผ์ ๊ณต๋ฐฑ์ด ํ์ํ๋ค.
- ๊ณต๋ฐฑ์ ์ถ๋ ฅํ ๋ค์์๋ ๋ ์ง๋ฅผ 1,2,3,4,5..์ต๋์ผ ๋งํผ ์ถ๋ ฅํ๋
- ์ผ์ ์๋ฆฌ์ผ ๋ (1~9) ๋ ์ซ์ ์์ ๊ณต๋ฐฑ์ ํ๋ ๋ ์ถ๊ฐํ๋ค.
- ์ค๋ฐ๊ฟ : ๊ณต๋ฐฑ(dayWeek1 -1) + ์ ๋ ฅ๋์ซ์(i) ๊ฐ 7์ด๋ฉด ์ผ์ํ์๋ชฉ๊ธํ ๊ฐ ์ฑ์์ง ๊ฒ์ด๋ฏ๋ก ์ค๋ฐ๊ฟ์ ํด์ผ ํ๋ค.
if ((dayWeek1 - 1 + i ) % 7 == 0)
์ผ ๋System.out.println();
์ผ๋ก ์ค๋ฐ๊ฟ์ ํ๋ค.
์ ๋ ์ด๋ณด์ด๊ธฐ ๋๋ฌธ์ ์ ์ฝ๋๊ฐ ์ข์ ์ฝ๋๊ฑฐ๋ ๊น๋ํ ์ฝ๋๋ ์๋ ๊ฒ๋๋ค.
ํ์ง๋ง ์ผ๋จ ๋์์ ํ๊ธฐ ๋๋ฌธ์ ๊ณต์ ํ๋ ์ฐจ์์์ ์ฌ๋ฆฝ๋๋ค. ์ฐธ๊ณ ๋ง ํ์ธ์!
์ ์ฒด ์ฝ๋
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class MyCalendar {
static MyCalendar myCalendar = new MyCalendar();
public static void main(String[] args) {
myCalendar.starter();
}
public void starter(){
Scanner scanner = new Scanner(System.in);
System.out.println("ํ์ฌ ๋ฌ๋ ฅ ์ถ๋ ฅ : a , ๊ณผ๊ฑฐ ๋ฌ๋ ฅ ์ถ๋ ฅ : z");
String input = scanner.next();
switch (input) {
case "a" :
buildCurrentCalendar();
break;
case "z" :
int year = getYear();
int month = getMonth();
buildPastCalendar(year, month);
break;
default:
System.out.println("์๋ชป๋ ๋ช
๋ น์ด์
๋๋ค. ๋ค์ ์
๋ ฅํ์ธ์");
starter();
break;
}
}
public int getYear() {
Scanner scanner = new Scanner(System.in);
System.out.println("\n๐ ์ถ๋ ฅ์ ์ํ๋ ์ฐ๋๋ฅผ ์ซ์๋ก ์
๋ ฅํ์ธ์.");
int yearInput = scanner.nextInt();
if (yearInput <= 0) {
System.out.println("โ ์ฐ๋๋ ์์ฐ์๋ก ์
๋ ฅํด ์ฃผ์ธ์.");
yearInput = scanner.nextInt();
}
return yearInput;
}
public int getMonth() {
Scanner scanner = new Scanner(System.in);
System.out.println("\n๐ ์ถ๋ ฅ์ ์ํ๋ ์์ ์ซ์๋ก ์
๋ ฅํ์ธ์.");
int monthInput = scanner.nextInt();
if (monthInput <= 0 || monthInput > 12) {
System.out.println("โ ์์ 1์ด์ 12์ดํ์ ์์ฐ์๋ก ์
๋ ฅํด ์ฃผ์ธ์.");
monthInput = scanner.nextInt();
}
return monthInput;
}
public int[] getCurrent() {
Calendar calendar = Calendar.getInstance();
int currentYear = calendar.get(Calendar.YEAR);
int currentMonth = calendar.get(Calendar.MONTH) + 1;
int[] currentYearMonth = {currentYear, currentMonth};
return currentYearMonth;
}
public boolean isLeapYear(int year) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
return true;
else
return false;
}
public int calMonth1stDayWeek(int year, int month) {
Calendar calendar = Calendar.getInstance();
Date currentTime = new Date();
String YMD = year + "-" + month + "-01";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String today = formatter.format(currentTime);
System.out.println("<์ค๋ ๋ ์ง๋ " + today + "์
๋๋ค>");
try {
calendar.setTime(formatter.parse(YMD));
} catch (ParseException e) {
e.printStackTrace();
}
int dayNum = calendar.get(Calendar.DAY_OF_WEEK);
// 1(์ผ) 2(์) 3(ํ) 4(์) 5(๋ชฉ) 6(๊ธ) 7(ํ )
return dayNum;
}
public void buildCurrentCalendar() {
//(๊ธฐ๋ณธ๊ฐ์ผ๋ก๋ ํ์ฌ๋ ์ง์ ๋ฌ๋ ฅ์ ์ถ๋ ฅ)
// 1. ์ฐ, ์ ๊ฒฐ์
int year = myCalendar.getCurrent()[0];
int month = myCalendar.getCurrent()[1];
// 2. ์ ๊ฐ์ง๊ณ ์ต๋์ผ ๊ฒฐ์ (2์์ด๋ฉด ์ค๋
test, ์ค๋
์ด๋ฉด ์ต๋์ผ๋ฐฐ์ด=dayDataLeapYear)
int dayMax = 0;
int[] dayData = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int[] dayDataLeapYear = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
boolean leapTest = isLeapYear(year);
if (month == 2 && leapTest == true) { //2์์ด๊ณ ์ค๋
dayMax = dayDataLeapYear[month - 1];
}
if (month == 2 && leapTest == false) { //2์์ด์ง๋ง ์ค๋
X
dayMax = dayData[month - 1];
}
if (month != 2) { // 2์ ์๋
dayMax = dayData[month - 1];
}
// 3. ์์ 1์ผ์ ์์ผ ๊ณ์ฐ
int dayWeek1 = calMonth1stDayWeek(year, month); // ํ์ฌ ์์ 1์ผ์ ์์ผ
// 4. ๋ฌ๋ ฅ ํํ๋ก ์ถ๋ ฅ - printCalendar
printCalendar(year, month, dayMax, dayWeek1);
}
public void buildPastCalendar(int year, int month){
// (์ฐ, ์์ ์
๋ ฅ๋ฐ์ผ๋ฉด ๊ทธ ์ฐ, ์์ ๋ฌ๋ ฅ์ ์ถ๋ ฅ.)
// 1. ์ฐ, ์ ๊ฒฐ์ = ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ด
// 2. ์ ๊ฐ์ง๊ณ ์ต๋์ผ ๊ฒฐ์ (2์์ด๋ฉด ์ค๋
test, ์ค๋
์ด๋ฉด ์ต๋์ผ๋ฐฐ์ด=dayDataLeapYear)
int dayMax = 0;
int[] dayData = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int[] dayDataLeapYear = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
boolean leapTest = isLeapYear(year);
if (month == 2 && leapTest == true) { //2์์ด๊ณ ์ค๋
dayMax = dayDataLeapYear[month - 1];
}
if (month == 2 && leapTest == false) { //2์์ด์ง๋ง ์ค๋
X
dayMax = dayData[month - 1];
}
if (month != 2) { // 2์ ์๋
dayMax = dayData[month - 1];
}
// 3. ์์ 1์ผ์ ์์ผ ๊ณ์ฐ
int dayWeek1 = calMonth1stDayWeek(year, month); // ๊ธฐ์ค ์์ 1์ผ์ ์์ผ
// 4. ๋ฌ๋ ฅ ํํ๋ก ์ถ๋ ฅ - printCalendar
printCalendar(year, month, dayMax, dayWeek1);
}
public void printCalendar(int year, int month, int dayMax, int dayWeek1) {
// ์์ 1์ผ์ ์์ผ๋ถํฐ(dayWeek1) 1~์ต๋์ผ ์ถ๋ ฅ.
System.out.println("========== " + year + "๋
" + month + "์ ==========");
System.out.println(" ์ผ ์ ํ ์ ๋ชฉ ๊ธ ํ ");
for (int j = 1; j < dayWeek1; j++) {
System.out.print(" โจ "); //
}
for (int i = 1; i <= dayMax; i++) {
if (i < 10) {// ํ ์๋ฆฌ ์์ด๋ฉด ์์ ๊ณต๋ฐฑ ํ ๋ฒ ๋ ์ถ๊ฐ
System.out.print(" " + i + " ");
}
if (i >= 10) {
System.out.print(" " + i + " ");
}
// ์ค๋ฐ๊ฟ
if ((dayWeek1 - 1 + i ) % 7 == 0) { // ๊ณต๋ฐฑ = (dayWeek1 - 1) + i ๊ฐ ์ผ์ฃผ์ผ ํ ์ค.
System.out.println();//์ค๋ฐ๊ฟ
}
}
}
}