본문 바로가기
개발로그/JAVA

자바의 정석 Chapter.10 연습문제

by 쩜징 2023. 7. 23.

10-1

import java.uti.*;
import java.text.*;

class Exercise10_1 {
	public static void main(String[] args) {
    	Calendar cal = Calendar.getInstance();
        cal.set(2010,0,1) //2010.1.1로 설정
        
       for (int i=0; i<12; i++) {
       	int weekday = cal.get(Calendar.DAY_OF_WEEK); //1일의 요일 구함
        int secondSunday = (weekday==1) ? 8 : 16 - weekday;
        
        //두번째 일요일로 날짜를 바꿈
        cal.set(Calendar.DAY_OF_MONTH, secondSunday);
        
        //Date로 변환해서 format에 맞게 출력
        //F : 월의 몇 번째 요일?  E : 요일
        Date d = cal.getTime();
        System.out.println(new SimpleDateFormat("yyyy-MM-dd은 F번째 E요일입니다.").format(d));
        
        //날짜를 다음달 1일로 변경한다.
        cal.add(Calendar.MONTH, 1); //월+1
        cal.set(Calendar.DAY_OF_MONTH, 1); //1일로 변경
       }
    }
}
1일의 요일 weekday 2번째 일요일 weekday + 2번째 일요일
1 8일 9
2 14일 16
3 13일 16
4 12일 16
5 11일 16
6 10일 16
7 9일 16

 

10-2

if (from == null || to == null) return 0;

if (from.equals(to) && from.get(Calendar.DAY_OF_MONTH) == 21) {
	return 1;
}

int fromYear = from.get(Calendar.YEAR);
int fromMon = from.get(Calendar.MONTH);
int fromDay = from.get(Calendar.DAY_OF_MONTH);

int toYear = to.get(Calendar.YEAR);
int toMon = to.get(Calendar.MONTH);
int toDay = to.get(Calendar.DAY_OF_MONTH);

//몇 개월 차이인지 계산
int monDiff = (toYear * 12 + toMon) - (fromYear * 12 + fromMon);

if (monDiff < 0) return 0;

if (fromDay <= 21 && toDay >= 21)
	monDiff++;
    
if (fromDay > 21 && toDay < 21)
	monDiff--;

 

10-3

import java.util.*;
import java.text.*;

class Exercise10_3 {
	public static void main(String[] args) {
    	String data = "123,456,789.5";
        
        DecimalFormat df = new DecimalFormat("#,###.##");
        DecimalFormat df2 = new DecimalFormat("#,####");
        //#은 빈자리를 채우지 않음
        
        try {
        	Number num = df.parse(data);
            //모든 Wrapper class는 Number class를 상속받음
            
            double d = num.doubleValue();
            System.out.println("data:"+data);
            System.out.println("반올림:"+Math.round(d));
            System.out.println("만단위:"+df2.format(d));
        } catch (Exception e) {}
    }
}

parse의 반환타입이 Number

 

10-4

import java.util.*;
import java.text.*;

class Exercise10_4 {
	public static void main(String[] args) {
    	String pattern = "yyyy/MM/dd";
        String pattern2 = "입력하신 날짜는 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());
                break; //parse()에서 예외가 발생하자면 이 문장은 수행되지 않음
            }catch (Exception e) {}
        } while(true);
        
        System.out.println(df2.format(inDate));
    }
}

 

10-5

static int getDayDiff(String yyyymmdd1, String yyyymmdd2) {
	int diff = 0;
    
    try {
    	int year1 = Integer.parseInt(yyyymmdd1.substring(0,4));
        int month1 = Integer.parseInt(yyyymmdd1.substring(4,6))-1;
        int day1 = Integer.parseInt(yyyymmdd1.substring(6,8));
        
        int year2 = Integer.parseInt(yyyymmdd2.substring(0,4));
        int month2 = Integer.parseInt(yyyymmdd2.substring(4,6))-1;
        int day2 = Integer.parseInt(yyyymmdd2.substring(6,8));
        
        Calendar date1 = Calendar.getInstance();
        Calendar date2 = Calendar.getInstance();
        
        date1.set(year1, month1, day1);
        date2.set(year2, month2, day2);
        
        diff = (int)((date1.getTimeInMillis()-date2.getTimeInMillis())/(24*60*60*1000));
    }catch (Exception e) {
    	diff = 0;
    }
	return diff;
}

getTimeInMillis() 1000분의 1초 단위 ---> /1000*24(시)*60(분)*60(초)

 

 

10-6

import java.time.*;
import java.time.temporal.*;

class Exercise10_6 {
	public static void main(Stirng[] args) {
 		LocalDate birth = LocalDate.of(1995, 1, 12);
        LocalDate now = LocalDate.now();
        
        long days = birthDay.until(now, ChronoUnit.DAYS);
        
        System.out.println("birthday=" + birthday);
        System.out.println("today   =" + today);
        System.out.println(long + " days");
	}
}

until() 메소드 dday 또는 두 날짜의 차이?!!

 

 

10-7

import java.time.*;
import static java.time.DayOfWeek.*;
import static java.time.temporal.TemporalAdjusters.*;

class Exercise10_7 {
	public static void main(String[] args) {
    	LocalDate date = LocalDate.of(2016, 12, 27);
        System.out.println(date.with(dayOfWeekInMonth(4, TUESDAY))); //넷째주 화요일의 날짜 출력
	}
}

 

10-8

import java.time.*;

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);
        //ZonedDateTime zdtNY = ZonedDateTime.now(ZoneId.of(“America/New_York”));
        
        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.println("diff=%d hrs%n", diff);
	}
}

getOffset()은 ZoneOffset을 반환, ZoneOffset의 getTotalSeconds()를 호출하면 날짜와 시간을 초단위로 변환한 결과가 나온다.

 

ZoneOffset offset = zdt.getOffset();

long sec1 = offset.getTotalSeconds();

 

 

반응형

댓글