[10-1] Calendar 클래스와 SimpleDateFormat클래스를 이용해서 2010년의 매월 두 번째 일요일의 날짜를 출력하시오.
2010-01-10은 2번째 일요일입니다.
2010-02-14은 2번째 일요일입니다.
2010-03-14은 2번째 일요일입니다.
2010-04-11은 2번째 일요일입니다.
2010-05-09은 2번째 일요일입니다.
2010-06-13은 2번째 일요일입니다.
2010-07-11은 2번째 일요일입니다.
2010-08-08은 2번째 일요일입니다.
2010-09-12은 2번째 일요일입니다.
2010-10-10은 2번째 일요일입니다.
2010-11-14은 2번째 일요일입니다.
2010-12-12은 2번째 일요일입니다.
답
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Exercise10_1 {
public static void main(String[] args){
Calendar cal = Calendar.getInstance();
cal.set(2010,0,1); //cal의 날짜를 2010년 1월 1일로 설정한다.
for(int i =0;i<12;i++){
int weekday = cal.get(Calendar.DAY_OF_WEEK); //1일의 요일을 구한다.
//두 번째 일요일은 1일의 요일에 따라 달라진다.
//1일이 일요일인 경우에는 두번째 일요일은 8일이고,
//1일이 다른 요일일 때는 16에서 1일의 요일을 빼면 알 수 있다.
int secondSunday = (weekday == 1)?8:16-weekday;
//두 번째 일요일로 cal의 날짜(DAY_OF_MONTH)를 바꾼다.
cal.set(Calendar.DAY_OF_MONTH, secondSunday);
Date d = cal.getTime(); //Calendar를 Date로 변환한다.
System.out.println(new SimpleDateFormat("yyyy-MM-dd은 F번째 E요일입니다.").format(d));
//날짜를 다음달 1일로 변경한다.
cal.add(Calendar.MONTH, 1);
cal.set(Calendar.DAY_OF_MONTH,1);
}
}
}
[10-2] 어떤 회사의 월급날이 매월 21일이다. 두 날짜 사이에 월급날이 몇 번있는지 계산해서 반환하는 메서드를 작성하고 테스트하시오.
2010-01-01~2010-01-01:0
2010-01-21~2010-01-21:1
2010-01-01~2010-03-01:2
2010-01-01~2010-03-23:3
2010-01-23~2010-03-21:2
2011-01-22~2010-03-21:0
답
import java.util.*;
import java.text.*;
class Exercise10_2 {
static int paycheckCount(Calendar from, Calendar to) {
/*
* (1) 아래의 로직에 맞게 코드를 작성하시오.
* 1.from 또는 to가 null이면 0을 반환한다.
* 2.from와 to가 같고 날짜가 21일이면 1을 반환한다.
* 3.to와 from이 몇 개월 차이인지 계산해서 변수 monDiff에 담는다.
* 4.monDiff가 음수이면 0을 반환한다.
* 5.만일 from의 일(DAY_OF_MONTH)이 21일이거나 이전이고
* to의 일(DAY_OF_MONTH)이 21일이거나 이후이면 monDiff의 값을 1 증가시킨다.
* 6.만일 from의 일(DAY_OF_MONTH)이 21일 이후고
* to의 일(DAY_OF_MONTH)이 21일 이전이면 monDiff의 값을 1 감소시킨다.
*/
if (from == null || to == null) return 0;
if (from.get(Calendar.YEAR) == to.get(Calendar.YEAR) &&
from.get(Calendar.MONTH) == to.get(Calendar.MONTH) &&
from.get(Calendar.DAY_OF_MONTH) == to.get(Calendar.DAY_OF_MONTH) &&
from.get(Calendar.DAY_OF_MONTH) == 21) {
return 1;
}
int monDiff = (to.get(Calendar.YEAR) - from.get(Calendar.YEAR)) * 12 +
(to.get(Calendar.MONTH) - from.get(Calendar.MONTH));
if (monDiff < 0) return 0;
if (from.get(Calendar.DAY_OF_MONTH) <= 21 && to.get(Calendar.DAY_OF_MONTH) >= 21) {
monDiff++;
} else if (from.get(Calendar.DAY_OF_MONTH) > 21 && to.get(Calendar.DAY_OF_MONTH) < 21) {
monDiff--;
}
return monDiff;
}
static void printResult(Calendar from, Calendar to) {
Date fromDate = from.getTime();
Date toDate = to.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.print(sdf.format(fromDate) + "~" + sdf.format(toDate) + ":");
System.out.println(paycheckCount(from, to));
}
public static void main(String[] args) {
Calendar fromCal = Calendar.getInstance();
Calendar toCal = Calendar.getInstance();
fromCal.set(2010, 0, 1);
toCal.set(2010, 0, 1);
printResult(fromCal, toCal);
fromCal.set(2010, 0, 21);
toCal.set(2010, 0, 21);
printResult(fromCal, toCal);
fromCal.set(2010, 0, 1);
toCal.set(2010, 2, 1);
printResult(fromCal, toCal);
fromCal.set(2010, 0, 1);
toCal.set(2010, 2, 23);
printResult(fromCal, toCal);
fromCal.set(2010, 0, 23);
toCal.set(2010, 2, 21);
printResult(fromCal, toCal);
fromCal.set(2011, 0, 22);
toCal.set(2010, 2, 21);
printResult(fromCal, toCal);
}
}
[10-3] 문자열 "123,456,789.5"를 소수점 첫 번째 자리에서 반올림하고, 그 값을 만 단위마다 콤마( , )로 구분해서 출력하시오.
data:123,456,789.5
반올림:123456790
만단위:1,2345,6790
답
import java.text.DecimalFormat;
public class Exercise10_3 {
public static void main(String[] args) {
String data = "123,456,789.5";
DecimalFormat formatter = new DecimalFormat("####,####");
Long roundData = Math.round(Double.parseDouble(data.replace(",", "")));
System.out.println("data: " + data);
System.out.println("반올림: " + roundData.toString());
System.out.println("만단위: " + formatter.format(roundData));
}
}
[10-4] 화면으로부터 날짜를 "2007/05/11"의 형태로 입력받아서 무슨 요일인지 출력하는 프로그램을 작성하시오. 단, 입력된 날짜의 형식이 잘못된 경우 메세지를 보여주고 다시 입력받아야 한다.
날짜를 yyyy/MM/dd의 형태로 입력해주세요. (입력예:2007/05/11)
>>2009-12-12
날짜를 yyyy/MM/dd의 형태로 입력해주세요. (입력예:2007/05/11)
>>2009/12/12
입력하신 날짜는 토요일입니다.
답
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Exercise10_4 {
public static void main(String[] args) {
String pattern = "yyyy/MM/dd";
String pattern2 = "입력하신 날짜는 E요일입니다."; //'E'는 일~토 중의 하나가 된다.
DateFormat df = new SimpleDateFormat(pattern);
DateFormat df2 = new SimpleDateFormat(pattern2);
Scanner s = new Scanner(System.in);
Date inDate = null;
do {
System.out.println("날짜를 " + pattern + "의 형태로 입력해주세요. (입력예:2007/05/11)");
try {
System.out.print(">>");
inDate = df.parse(s.nextLine()); // 입력받은 날짜를 Date로 변환한다.
break; // parse()에서 예외가 발생하면 이 문장은 수행되지 않는다.
} catch(Exception e) {}
} while(true);
System.out.println(df2.format(inDate));
}
}
[10-5] 다음과 같이 정의된 메서드를 작성하고 테스트하시오.
메서드명:getDayDiff
기능:yyyymmdd형식의 두 문자열을 넘겨받으면 두 날짜의 차이를 일(day)단위로 반환한다.
단, 첫 번째 날짜 빼기 두 번째 날짜의 결과를 반환한다.
만일 주어진 문자열이 유효하지 않으면 0을 반환한다.
반환타입:int
매개변수:
- String yyyymmdd1 - 시작 날짜
- String yyyymmdd2 - 끝 날짜
2
0
0
답
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
class Exercise10_5 {
/*
* (1) getDayDiff 메서드를 작성하시오.
*/
public static int getDayDiff(String yyyymmdd1, String yyyymmdd2) {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
int ret = 0;
try {
Date date1 = format.parse(yyyymmdd1);
Date date2 = format.parse(yyyymmdd2);
long diff = (date1.getTime() - date2.getTime()) / (24 * 60 * 60 * 1000);
ret = (int) Math.abs(diff);
} catch (ParseException e) {
//System.out.println("날짜 형식이 잘못되었습니다. 올바른 형식: yyyyMMdd");
ret = 0; // 오류가 발생한 경우 0을 반환합니다.
}
return ret;
}
public static void main(String[] args) {
System.out.println(getDayDiff("20010103", "20010101")); // 2
System.out.println(getDayDiff("20010103", "20010103")); // 0
System.out.println(getDayDiff("20010103", "200103")); // -1 (잘못된 형식)
}
}
[10-6] 자신이 태어난 날부터 지금까지 며칠이 지났는지 계산해서 출력하시오.
birth day =2000-01-01
today = 2016-01-29
5872 days
답
import java.time.*;
import java.time.temporal.*;
public class Exercise10_6 {
public static void main(String[] args){
LocalDate birthDay = LocalDate.of(1994,11,12);
LocalDate now = LocalDate.now();
long days = birthDay.until(now, ChronoUnit.DAYS);
System.out.println("birth day="+birthDay);
System.out.println("today="+now);
System.out.println(days+" days");
}
}
[10-7] 2016년 12월 넷째주 화요일의 날짜를 아래의 실행결과와 같은 형식으로 출력하시오.
2016-12-27
답
import java.time.*;
import static java.time.DayOfWeek.*;
import static java.time.temporal.TemporalAdjusters.*;
public class Exercise10_7 {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2016, 12, 1);
System.out.println(date.with(dayOfWeekInMonth(4, TUESDAY)));
}
}
[10-8] 서울과 뉴욕간의 시차가 얼마인지 계산하여 출력하시오.
2016-01-28T23:01:00.136+09:00[Asia/Seoul]
2016-01-28T09:01:00.138-05:00[America/New_York]
sec1=32400
sec2=-18000
diff=14 hrs
답
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import static java.time.DayOfWeek.TUESDAY;
import static java.time.temporal.TemporalAdjusters.dayOfWeekInMonth;
public class Exercise10_8 {
public static void main(String[] args) {
ZonedDateTime zdt = ZonedDateTime.now();
ZoneId nyId = ZoneId.of("America/New_York");
ZonedDateTime zdtNY = ZonedDateTime.now().withZoneSameInstant(nyId);
System.out.println(zdt);
System.out.println(zdtNY);
long sec1 = zdt.getOffset().getTotalSeconds();
long sec2 = zdtNY.getOffset().getTotalSeconds();
long diff = (sec1 - sec2) / 3600;
System.out.println("sec1=" + sec1);
System.out.println("sec2=" + sec2);
System.out.printf("diff=%d hrs%n", diff);
}
}
'개념' 카테고리의 다른 글
[JAVA의 정석] Chapter12_연습문제 (2) | 2024.12.15 |
---|---|
[JAVA의 정석] Chapter11_연습문제 (0) | 2024.12.15 |
[JAVA의 정석] Chapter09_연습문제 (0) | 2024.12.15 |
[JAVA의 정석] Chapter08_연습문제 (1) | 2024.12.13 |
[JAVA의 정석] Chapter07_연습문제 (0) | 2024.12.10 |