import! java.util.*;
class CalendarTest
{
public static void main(String[] args)
{
if(args.length !=2)
{
System.out.println("Usage : java CalendarTest 2004 11");
return;
}
int year = Integer.parseInt(args[0]);
int month = Integer.parseInt(args[1]);
int START_DAY_OF_WEEK = 0;
int END_DAY = 0;
Calendar sDay = Calendar.getInstance(); // 시작일
Calendar eDay = Calendar.getInstance(); // 끝일
// 월의 경우 0부터 11까지의 값을 가지므로 1을 빼줘야한다.
// 예를 들어, 2004년 11월 1일은 sDay.set(2004, 10, 1);과 같이 해줘야한다.
sDay.set(year, month-1, 1);
eDay.set(year, month, 1);
// 다음달의 첫날에서 하루를 빼면 현재달의 마지막날이된다.
// 12월 1일에서 하루를 빼면 11월 30일이 된다.
// 2월의 경우 28일인지 29일인지 모르기 때문에 이렇게 한다.
eDay.add(Calendar.DAY_OF_MONTH, -1);
// 첫번째 요일이 무슨요일인지 알아낸다.
START_DAY_OF_WEEK = sDay.get(Calendar.DAY_OF_WEEK);
// eDay에 지정된 날짜를 얻어온다.
END_DAY = eDay.get(Calendar.DAY_OF_MONTH);
System.out.println(" " + args[0] +"년 " + args[1] +"월");
System.out.println(" SU MO TU WE TH FR SA");
// 해당월의 1일이 어느 요일인지에 따라서 공백을 출력한다.
// 만일 1일이 수요일이라면 공백을 세번 찍는다.(일요일부터 시작)
for(int i=1; i < START_DAY_OF_WEEK; i++) {
System.out.print(" ");
}
for(int i=1, n=START_DAY_OF_WEEK ; i <= END_DAY; i++, n++) {
System.out.print((i < 10)? " "+i : " "+i );
if(n%7==0) System.out.println();
}
}
}
/*
C:\j2sdk1.4\work>java CalendarTest 2004 3
2004년 3월
SU MO TU WE TH FR SA
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
C:\j2sdk1.4\work>
*/
====================================================================
// 날짜관련함수 - 날짜간의 차이, 요일구하기, 윤년체크 //
import! java.util.*;
class DateTest
{
public static void main(String[] args)
{
int year=2004;
int month = 4;
int day = 31;
System.out.println("2004. 5. 31 :" + getDayOfWeek(2004, 5, 31));
System.out.println("2002. 6. 1 :" + getDayOfWeek(2002, 6, 1));
System.out.println("1972. 1. 2 :" + getDayOfWeek(1972, 1, 2));
System.out.println("2004. 5. 1 - 2004.4.28 :"
+ dayDiff("2004-05-01", "2004-04-28"));
System.out.println("2004. 6. 10 - 2004.6.3 :"
+ dayDiff("2004-06-10", "2004-06-03"));
System.out.println("2005. 6. 29 : "+convertDateToDay(2005, 6, 29));
System.out.println("732126 : "+convertDayToDate(732126));
System.out.println("2005. 6. 29 : "+convertDayToDate
(convertDateToDay(2005, 6, 29)));
System.out.println("2005. 2. 28 : "+convertDayToDate
(convertDateToDay(2005, 2, 28)));
System.out.println("2004. 2. 29 : "+convertDayToDate
(convertDateToDay(2004, 2, 29)));
System.out.println("2001. 12. 31 : "+convertDayToDate
(convertDateToDay(2001, 12, 31)));
System.out.println("2002. 1. 1 : "+convertDayToDate
(convertDateToDay(2002, 1, 1)));
}
// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
public static int[] endOfMonth =
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public static boolean isLeapYear(int year)
{
return ((year%4==0)&&(year%100!=0)||(year%400==0));
}
public static int dayDiff(String fromDate, String toDate)
{
int year1=0, month1=0, day1=0;
int year2=0, month2=0, day2=0;
String[] date1 = fromDate.split("-");
String[] date2 = toDate.split("-");
year1 = Integer.parseInt(date1[0]);
month1 = Integer.parseInt(date1[1]);
day1 = Integer.parseInt(date1[2]);
year2 = Integer.parseInt(date2[0]);
month2 = Integer.parseInt(date2[1]);
day2 = Integer.parseInt(date2[2]);
int fromDay = convertDateToDay(year1, month1, day1);
int toDay = convertDateToDay(year2, month2, day2);
return fromDay - toDay;
}
public static String convertDayToDate(int day)
{
int year=1;
int month=0;
int numOfLeapYear =0; // 윤년의 수
while(true)
{
int aYear = isLeapYear(year)? 366 :365;
if (day > aYear )
{
day-= aYear;
year++;
}
else
{
break;
}
}
if (day > 0)
{
while(true)
{
int endDay = endOfMonth[month];
if(isLeapYear(year) && month == 1) endDay++;
// 윤년이고 윤달이 포함되어 있으면, 1일을 더 뺀다.
if(day > endDay)
{
day -= endDay;
month++;
}
else
{
break;
}
}
} // if
return year+"-"+(month+1)+"-"+day;
}
public static int convertDateToDay(int year, int month, int day)
{
int numOfLeapYear =0; // 윤년의 수
// 전년도까지의 윤년의 수를 구한다.
for(int i=1;i < year; i++)
{
if(isLeapYear(i))
numOfLeapYear++;
}
// 전년도까지의 일 수를 구한다.
int toLastYearDaySum = (year-1) * 365 + numOfLeapYear;
// 올해의 현재 월까지의 일수 계산
int thisYearDaySum =0;
for(int i=0; i < month-1; i++)
{
thisYearDaySum+=endOfMonth[i];
}
// 윤년이고, 2월이 포함되어 있으면 1일을 증가시킨다.
if (month > 2 && isLeapYear(year))
{
thisYearDaySum++;
}
thisYearDaySum+=day;
return toLastYearDaySum+thisYearDaySum;
}
public static int getDayOfWeek(int year, int month, int day)
{
// 0~6의 값을 반환한다. 결과가 0이면 일요일이다.
return convertDateToDay(year, month, day)%7;
}
}
/*
오늘이 올해의 몇주차인지 계산하는 방법은 올해 1월 1일을 일로 바꾼것과
오늘의 날짜를 일로 바꾼 것의 차이를 구하면(정확히는 하루를 빼주어야함)
오늘이 올해의 몇일 째인지를 구할수 있죠. 그 차이를 day라고 할때
(day + 요일값) / 7 + ((day + 요일값) / 7 == 0)? 0: 1하면 됩니다.
여기서 요일 값은 0~6의 값이며, 일요일은 0이고 토요일이 6입니다.
*/
'IT_Programming > Java' 카테고리의 다른 글
Effective JAVA™ Programming Language Guide - 1 (0) | 2007.02.15 |
---|---|
배열의 초기화 사용법 차이 arr = {1,2,3,4,5}와 arr = new int[]{1,2,3,4,5}의 차이 (0) | 2007.02.09 |
현재시간을 알려주는 Swing시계 java.swing.Timer클래스 사용. (0) | 2007.02.06 |
시간이 증가하는 Timer (0) | 2007.02.06 |
시간이 감소하는 타이머 (0) | 2007.02.06 |