[๊ตฌ๋์์นด๋ฐ๋ฏธ IT๊ตญ๋น์ง์] 1์ฃผ์ฐจ์ ๋ฐฐ์ด ๋ด์ฉ์ ๋ณต์ตํ๊ณ , Calendar ๊ธฐ๋ณธAPI ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ ์ง์ ์บ๋ฆฐ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๋ณด์๋ค.
๊ฐ์ฒด์งํฅ์ธ์ด
ํ์ค๊ณผ ๋๊ฐ์ ๊ฐ๋
์ ์ฝ๋ฉ
ex) ๊ธฐ๋ฅ(ํจ์)๊ฐ ๋ฐ์ ๋ฐ๋ก ์๋์ง, ์์ ๊ฐ์ด ๋ฃ๋์ง์ ์ฐจ์ด. ์๋ฅผ ๋ค์ด ๊ฒ์ ์ฝ๋ฉ์ ๊ธฐ์ฌ ์บ๋ฆญํฐ์ ๊ณต๊ฒฉ ๊ธฐ๋ฅ์ด ๊ธฐ์ฌ ์์ ๋ค์ด์์ผ๋ฉด ๊ฐ์ฒด์งํฅ, ๊ธฐ์ฌ ์บ๋ฆญํฐ์ ๊ณต๊ฒฉ ๊ธฐ๋ฅ์ด ๋ฐ๋ก ์กด์ฌํ๋ฉด ํจ์์งํฅ์ด๋ค.
8๋นํธ=1๋ฐ์ดํธ
๐ง์ฃผ๋ง์ ํ๊ธฐํ ๋ด์ฉ๋ค ํ๋ฒ๋ ์ ๋ฆฌํ๊ธฐ!
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.util.Calendar" %>
<%
// Calendar c = new Calendar(); // ๋ฌธ๋ฒ์ ์ผ๋ก ์ ์๋๋์ง๋ ๋์ค์ ๋ฐฐ์ธ ๊ฒ..
Calendar c = Calendar.getInstance();
String yoil = "";
switch(c.get(Calendar.DAY_OF_WEEK)) {
case 1 :
yoil = "์ผ";
break;
case 2 :
yoil = "์";
break;
case 3 :
yoil = "ํ";
break;
case 4 :
yoil = "์";
break;
case 5 :
yoil = "๋ชฉ";
break;
case 6 :
yoil = "๊ธ";
break;
case 7 :
yoil = "ํ ";
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div>
Calendar.getInstance() : <%=c%>
<!-- ์ค๋ ๋ ์ง์ ๋ํ ๋ชจ๋ ์ ๋ณด๊ฐ ๋ค์ด์์ (์ฌ๊ธฐ์๋ ์์น๋ํ ํฌํจ๋จ, ์๋๋ฉด ์์น์ ๋ฐ๋ผ ๋ ์ง์ ๋ณด๋ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์) -->
</div>
<!-- static ๋ฉ์๋์ด๋ฏ๋ก ํด๋์ค๋ช
(Calendar)์ผ๋ก ํธ์ถ๊ฐ๋ฅ, ํด๋์ค๋ช
์ ๋๋ฌธ์๋ก ์์ํ๋ฏ๋ก, ๋๋ฌธ์๋ฉด static ๋ฉ์๋์ -->
<div>Year : <%=c.get(Calendar.YEAR)%></div>
<div>Month : <%=c.get(Calendar.MONTH)%></div>
<!-- ์ฃผ์! 0์๋ถํฐ ์์ํ๋ฏ๋ก, +1ํด์ ์ฝ์ด์ผ ํ๋ค -->
<div>Date : <%=c.get(Calendar.DATE)%></div>
<div>์ด๋ฒ์ฃผ์ ๋ช๋ฒ์งธ ๋ ์ธ์ง : <%=c.get(Calendar.DAY_OF_WEEK)%></div>
<!-- ์ฃผ์! ์์ผ์ ์ผ์์ผ๋ถํฐ 1๋ก ์์ํจ, ์ผ์ํ์๋ชฉ๊ธํ (1,2,3,4,5,6,7) -->
<div>์์ผ : <%=yoil%>์์ผ</div>
<div>ํ์ฌ๋ฌ์ ๋ง์ง๋ง ๋ ์ง : <%=c.getActualMaximum(Calendar.DATE)%></div>
</body>
</html>
์ง๋ ์๊ฐ๋ถํฐ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋์๋ Calendar ๋ฉ์๋์ ๋ํด ๋ ์์ธํ ๋ฐฐ์ ๋ค. ํธ์ถ์ c.YEAR์ด ์๋, ํด๋์ค ๋ช ์ธ Calendar.YEAR ๋ผ๊ณ ํธ์ถํ๋ ๊ฒ์ ๋ณด๋ฉด static ๋ฉ์๋๋ผ๋ ๊ฒ์ ์ ์ ์๋ค. (static ๋ฉ์๋๋ ํด๋์ค๋ช ์ผ๋ก ์ถ๋ ฅ ๊ฐ๋ฅ, ์ฆ ํด๋์ค๋ช ์ ๋๋ฌธ์๋ก ์์ํ๋ฏ๋ก ๋๋ฌธ์๋ก ์์ํ๋์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ณด๋ฉด ๊ตฌ๋ถ ๊ฐ๋ฅํ๋ค!)
page import = "java.util.Calendar"
: ํจํค์ง๋ช
์๋ต
์ฌ์ฉ๋ฐฉ๋ฒ : ์ค๋ ๋ ์ง๊ฐ ๊ธฐ์ค
Calendar c = Calendar.getInstance();
c.get(Calendar.YEAR)
Calendar.getInstance() : <%=c%>
: Calendar ๋ฉ์๋๊ฐ ๊ฐ์ง๊ณ ์๋ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ ์ ์๋ค. ์ถ๋ ฅํ๋ฉด ๋ฌด์ํ ์ ๋ณด๊ฐ ๋์จ๋ค. ์ด ์ ๋ณด์๋ ๋ ์ง๋ฟ๋ง์ด ์๋๋ผ ํ์ฌ ์์น๋ ํฌํจ๋๋ค. ์์น์ ๋ฐ๋ผ ๋ ์ง ์ ๋ณด๋ ๋ฐ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.java.util.GregorianCalendar[time=1681788425121,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Seoul",offset=32400000,dstSavings=0,useDaylight=false,transitions=30,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2023,MONTH=3,WEEK_OF_YEAR=16,WEEK_OF_MONTH=4,DAY_OF_MONTH=18,DAY_OF_YEAR=108,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=27,SECOND=5,MILLISECOND=121,ZONE_OFFSET=32400000,DST_OFFSET=0]
์ด๋ค ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋์ง ํญ์ ๊ธฐ์ตํ๋ ๊ฒ์ ํ๋ค๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ๊ฐ์ง๊ณ ์๋ ์ ๋ณด๋ฅผ ์ถ๋ ฅํด๋ณด๊ณ , ์ฌ๊ธฐ์์ ์ํ๋ ์ ๋ณด๋ฅผ ๋ฝ์ ์ฌ์ฉํ๋ฉด ์ข๋ค.
c.get(Calendar.DAY_OF_WEEK))
: ์ค๋ ๋ ์ง๊ฐ ์ด๋ฒ์ฃผ์ ๋ช๋ฒ์งธ ๋ ์ธ์ง(๋ฌด์จ ์์ผ์ธ์ง) ์ถ๋ ฅํ ์ ์๋ค. ์ด๋ ์ถ๋ ฅ๋๋ ๊ฐ์ ์ผ์์ผ๋ถํฐ ํ ์์ผ๊น์ง 1,2,3,4,5,6,7์ด๋ค.
c.get(Calendar.MONTH)
: ์ค๋ ๋ ์ง๊ฐ ๋ช์์ธ์ง ์ถ๋ ฅํ ์ ์๋ค. ๋จ, ์์ 0์๋ถํฐ ์์ํ๊ธฐ ๋๋ฌธ์ +1์ ํด์ ์ฝ์ด์ผํ๋ฏ๋ก ์ฃผ์ํ๋ค! (1์=0์, 12์=11์)
c.getActualMaximum(Calendar.DATE)
: ์ค๋ ๋ ์ง์ ์์ ๋ง์ง๋ง์ผ์ด ๋ช์ผ์ธ์ง ์ถ๋ ฅํ ์ ์๋ค. ์ค๊ฐ์ Actual์ ๋นผ๋จน์ผ๋ฉด ์บ๋ฆฐ๋์ ์ต๋๊ฐ์ธ 31๋ง ์ถ๋ ฅ๋๋ฏ๋ก ์ฃผ์ ํด์ผ ํ๋ค!
์ง๊ธ๊น์ง ๋ฐฐ์ด ๋ด์ฉ์ผ๋ก ์ ์ฒด ์์ ๋ฌ๋ ฅ์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋๋ ์ค์ต์๊ฐ์ ๊ฐ์ก๋ค.
โ ๊ตฌํํด์ผํ ์
๐ ์์ฑ (1) - calendar.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.util.Calendar" %>
<%
int targetYear = 0; // ๋ณ์์ ์๋ช
์ฃผ๊ธฐ๋๋ฌธ์ if๋ฌธ๋ณด๋ค ๋จผ์ ๋ณ์ ์ ์ธํด์ผํจ
int targetMonth = 0;
if(request.getParameter("targetYear") == null
|| request.getParameter("targetMonth") == null ) {
Calendar today = Calendar.getInstance();
targetYear = today.get(Calendar.YEAR);
targetMonth = today.get(Calendar.MONTH);
} else {
targetYear = Integer.parseInt(request.getParameter("targetYear"));
targetMonth = Integer.parseInt(request.getParameter("targetMonth"));
if(targetMonth == -1){ // 1์ ์ ์ผ๋ก ๊ฐ๋ฉด ์๋
targetMonth = 11;
targetYear = targetYear - 1;
} else if(targetMonth == 12) { // 12์ ํ๋ก ๊ฐ๋ฉด ๋ด๋
targetMonth = 0;
targetYear = targetYear + 1;
}
}
// ๋๋ฒ๊น
์ฝ๋
// http://localhost/ex17/calendar.jsp?targetYear=2023&targetMonth=11
// http://localhost/ex17/calendar.jsp
System.out.println(targetYear + "<-- targetYear");
System.out.println(targetMonth + "<-- targetMonth");
Calendar firstDate = Calendar.getInstance(); // ์ค๋ ๋ ์ง ๋ฝ๊ธฐ
// ์ถ๋ ฅํ๊ณ ์ ํ๋ ๋
/์/1์ผ
firstDate.set(Calendar.YEAR, targetYear); // set ๋ฐ๊พธ๊ฒ ๋ค
firstDate.set(Calendar.MONTH, targetMonth);
firstDate.set(Calendar.DATE, 1);
// ๋ฌ๋ ฅ 1์ผ ์์ ๊ณต๋ฐฑ(td) ์ ๊ตฌํ๊ธฐ
// ํ์ฌ ์์ 1์ผ์ Day_OF_WEEK (์ผ์์ผ๋ถํฐ 1,2,3,4,5,6,7 ํ ์์ผ๊น์ง) - 1 // ์นธ์ ๊ฐฏ์๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ 1์ ๋นผ์ค๋ค
int startTdBlank = 0;
startTdBlank = firstDate.get(Calendar.DAY_OF_WEEK) - 1;
System.out.println(startTdBlank + " <-- startTdBlank"); // ๋๋ฒ๊น
// ์ถ๋ ฅํ๊ณ ์ ํ๋ ๋
/์/๋ง์ง๋ง๋ ์ง
int endDateNum = firstDate.getActualMaximum(Calendar.DATE); // Actual ์ฐจ์ด..?
System.out.println(endDateNum + "<-- endDateNum");
// ๋ฌ๋ ฅ ๋ง์ง๋ง๋ ์ง ์ถ๋ ฅ ํ ๊ณต๋ฐฑ(td)์ ์ ๊ตฌํ๊ธฐ
int endTdBlank = 0;
if((startTdBlank + endDateNum) % 7 != 0) {
endTdBlank = 7 - ((startTdBlank + endDateNum) % 7); // ๋๋์ด ๋จ์ด์ง์ง ์์ผ๋ฉด ๋ค์ ๊ณต๋ฐฑ์ด ์๊น, ๊ทธ ๊ณต๋ฐฑ์ ์ผ~ํ ์ด 7์นธ์์ ๋นผ๋ฉด ๋จ
}
int totalTdCnt = startTdBlank + endDateNum + endTdBlank;
System.out.println(endTdBlank + "<-- endTdBlank");
System.out.println(totalTdCnt + "<-- totalTdCnt");
// ์ ์ ๋ง์ง๋ง๋ ์ง ๊ตฌํ๊ธฐ
Calendar preDate = Calendar.getInstance();
preDate.set(Calendar.YEAR, targetYear);
preDate.set(Calendar.MONTH, targetMonth-1);
int preEndDate = preDate.getActualMaximum(Calendar.DATE);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>calendar.jsp</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
<style>
a {text-decoration: none;}
a:hover {text-decoration: underline;}
</style>
</head>
<body>
<div class="container">
<h1>
<a href="./calendar.jsp?targetYear=<%=targetYear%>&targetMonth=<%=targetMonth - 1%>">์ด์ ๋ฌ</a>
<%=targetYear%>๋
<%=targetMonth + 1%>์ <!-- ํ์๋ +1์ -->
<a href="./calendar.jsp?targetYear=<%=targetYear%>&targetMonth=<%=targetMonth + 1%>">๋ค์๋ฌ</a>
</h1>
<table class="table table-striped">
<thead>
<tr>
<th>์ผ</th>
<th>์</th>
<th>ํ</th>
<th>์</th>
<th>๋ชฉ</th>
<th>๊ธ</th>
<th>ํ </th>
</tr>
</thead>
<tbody>
<tr>
<%
for(int i=0; i<totalTdCnt; i++) {
if(i%7 == 0){
%>
</tr><tr>
<%
}
int dateNum = i - startTdBlank + 1;
if(dateNum > 0 && dateNum <= endDateNum) { // 1์ผ๋ถํฐ ๋ง์ง๋ง์ผ๊น์ง ์ถ๋ ฅ
if(i % 7 == 0) {
%>
<td>
<a class="text-danger" href="./diary.jsp?targetYear=<%=targetYear%>&targetMonth=<%=targetMonth%>&dateNum=<%=dateNum%>" target="_blank">
<%=dateNum%>
</a>
</td>
<%
} else if(i % 7 == 6) {
%>
<td>
<a class="text-primary" href="./diary.jsp?targetYear=<%=targetYear%>&targetMonth=<%=targetMonth%>&dateNum=<%=dateNum%>" target="_blank">
<%=dateNum%>
</a>
</td>
<%
} else {
%>
<td>
<a class="text-dark" href="./diary.jsp?targetYear=<%=targetYear%>&targetMonth=<%=targetMonth%>&dateNum=<%=dateNum%>" target="_blank">
<%=dateNum%>
</a>
</td>
<%
}
} else if(dateNum < 1){
%>
<td class="text-black-50">
<%=preEndDate + dateNum%>
</td>
<%
} else {
%>
<td class="text-black-50">
<%=dateNum - endDateNum%>
</td>
<%
}
}
%>
</tr>
</tbody>
</table>
</div>
</body>
</html>
์ฝ๋๋ฅผ ์ธ์ฐ๋ ค๊ณ ํ์ง ๋ง๊ณ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฒด์ ์ผ๋ก ์ดํดํ๊ธฐ
๋๋ฒ๊น ์ฝ๋ ์ ์์ฑํ๊ธฐ
set ๋ฉ์๋ ํ์ฉํ๊ธฐ
// ์ถ๋ ฅํ๊ณ ์ ํ๋ ๋
/์/1์ผ
firstDate.set(Calendar.YEAR, targetYear); // set ๋ฐ๊พธ๊ฒ ๋ค
firstDate.set(Calendar.MONTH, targetMonth);
firstDate.set(Calendar.DATE, 1);
๋ถํธ์คํธ๋ฉ5 ์ด์ฉํด์ css ํ๊ธฐ
aํ๊ทธ ๋งํฌ์ ๊ฐ ํฌํจํ๊ธฐ
<a href="./calendar.jsp?targetYear=<%=targetYear%>&targetMonth=<%=targetMonth - 1%>">์ด์ ๋ฌ</a>
<%=targetYear%>๋
<%=targetMonth + 1%>์ <!-- ํ์๋ +1์ -->
<a href="./calendar.jsp?targetYear=<%=targetYear%>&targetMonth=<%=targetMonth + 1%>">๋ค์๋ฌ</a>
โญ์ฃผ์? ํค=๊ฐ & ํค=๊ฐ
ํ์์ผ๋ก ์์ฑ!
๐ ๊ฒฐ๊ณผ
๐ ์์ฑ (2) - diary.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
int targetYear = Integer.parseInt(request.getParameter("targetYear"));
int targetMonth = Integer.parseInt(request.getParameter("targetMonth"));
int dateNum = Integer.parseInt(request.getParameter("dateNum"));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<h3><%=targetYear%>๋
<%=targetMonth + 1%>์ <%=dateNum%>์ผ์ ์ผ์ ์ ์
๋ ฅํ์ธ์</h3>
<form>
<table>
<tr>
<th>์ ๋ชฉ</th>
<td><input type="text"></td>
<td><input type="checkbox">์ค์</td>
</tr>
<tr>
<th>์ฅ์</th>
<td><input type="text"></td>
<td>์ง๋์ฒจ๋ถ<input type="file"></td>
</tr>
<tr>
<th>์ผ์</th>
<td><input type ="date"></td>
<td><input type="checkbox">์ข
์ผ</td>
</tr>
<tr>
<th>์ฐธ์์</th>
<td><input type="text"></td>
<td><input type="button" value="๋ค์ด๋ฒ ์ฃผ์๋ก"></td>
</tr>
<tr>
<th>๊ณต๊ฐ</th>
<td colspan = "2">
<input type="radio" name="open">๊ธฐ๋ณธ
<input type="radio" name="open">๋น๊ณต๊ฐ
</td>
<!-- <td></td> -->
</tr>
<tr>
<th>์ค๋ช
</th>
<td colspan = "2"><textarea rows="3" cols="50"></textarea></td>
<!-- <td></td> -->
</tr>
<tr>
<th>ํ์ผ</th>
<td colspan = "2"><input type="file"></td>
<!-- <td></td> -->
</tr>
<tr>
<th>์๋ฆผ</th>
<td colspan = "2">
<select id = "alarm">
<option value = "10๋ถ์ ">10๋ถ์ </option>
<option value = "1์๊ฐ์ ">1์๊ฐ์ </option>
<option value = "ํ๋ฃจ์ ">ํ๋ฃจ์ </option>
</select>
</td>
<!-- <td></td> -->
</tr>
</table>
<button type="submit">์ ์ฅ</button>
<button type="reset">์ทจ์</button>
</form>
</body>
</html>
int targetYear = Integer.parseInt(request.getParameter("targetYear"));
int targetMonth = Integer.parseInt(request.getParameter("targetMonth"));
int dateNum = Integer.parseInt(request.getParameter("dateNum"));
๐ ๊ฒฐ๊ณผ
๋ฌ๋ ฅ์ ๋ ์ง๋ฅผ ํด๋ฆญํ๋ฉด ํด๋น ํ์ด์ง๊ฐ ์ถ๋ ฅ๋๋ค.
์ด๋ฒ ์์
์ ๋ณต์ต๊ณผ ์ค์ต ์์ฃผ๋ก ์ด๋ฃจ์ด์ก๋๋ฐ, ์ค์ต์ ํญ์ ์ด๋ ค์ด ๊ฒ ๊ฐ๋ค. ๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ์ ๊ณ์ํด์ ๋ค์ฌ๋ค๋ณด๊ณ ์ฝ์ด๋ณด๊ณ ํด์ํด๋ณด๋ฉด์ ์ต์ํด์ง๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ์ฝ๋๋ฅผ ๋จ์ํ ๋ฌ๋ฌ ์ธ์ฐ๊ธฐ๋ง ํ๋ฉด ์ ๋ ๋ด๊ฒ์ด ๋ ์ ์์ ๊ฒ์ด๋ค. ์ด๋ฒ ๊ณผ์ ๋ ์์๋ก ๋ค์ฌ๋ค๋ณด๋ฉด์ ์ต์ํด์ ธ์ผ๊ฒ ๋ค.