원지의 개발
article thumbnail
728x90

2022.10.25 - [프로그래밍 언어/Java] - [Java] API_ java.util (arrays - search, date, calendar, random)

→ 이어서 추가적인 설명과 연습과제 진행해보았다.

1. Date

  • Calendar가 새로 추가되면서 Date의 메서드가 'deprecated' 되었으므로 잘 사용하지 않음
  • 그럼에도 Date를 필요로 하는 메서드가 있으므로 변환 방법 알기

1.1. Date ↔ Calendar

<java />
package dateAndCalendarTest; import java.util.Calendar; import java.util.Date; public class DateCalendarChange { public static void main(String[] args) { //1. Date → Calendar Calendar cal1 = Calendar.getInstance(); Date d1 = new Date(cal1.getTimeInMillis()); //1/1000초 단위 시간 System.out.println(d1.toString()); //2. Calendar → Date Date d2 = new Date(); Calendar cal2 = Calendar.getInstance(); cal2.setTime(d2); System.out.println(cal2.get(Calendar.YEAR)); System.out.println(toString(cal2)); } public static String toString(Calendar date) { return date.get(Calendar.YEAR) + "년 " + date.get(Calendar.MONTH) + "월 " + date.get(Calendar.DATE) + "일"; } } ----------------------------------------------------------------------------------- Fri Sep 01 12:01:37 KST 2023 2023 202381

2. LocalDate / LocalTime / LocalDateTime

  • 날짜만 나타내는 LocalDate
  • 시간만 나타내는 LocalTime
  • 날짜 및 시간 나타내는 LocalDateTime
  • 을 계산할 때 -1을 하지 않아도 됨

2.0.1. 년월일 비교 - 같으면 시간과 분 / 다르면 년월일을 출력

<java />
package dateAndCalendarTest; import java.time.LocalDate; import java.time.LocalDateTime; public class DateCompare { public static void main(String[] args) { //기준, 현재 날짜 LocalDateTime currentTime = LocalDateTime.now(); LocalDate date1 = LocalDate.of(2023, 9, 1); LocalDate date2 = LocalDate.of(2023, 1, 1); //LocalDateTime 과 LocalDate 비교시 if(date1.isEqual(currentTime.toLocalDate())) { System.out.println(currentTime.getHour() + "시 " + currentTime.getMinute() + "분"); } if(!date2.isEqual(currentTime.toLocalDate())){ System.out.println("기준 날짜: " + currentTime.toString().substring(0, 10)); System.out.println("비교 날짜: " + date2.toString()); } } } ----------------------------------------------------------------------------------------------- 132분 기준 날짜: 2023-09-01 비교 날짜: 2023-01-01
  • LocalDateTime, LocalDate 비교시 isEqual 메서드 사용
  • 혹은 같은 클래스 사용시 compareTo 메서드 사용
    같으면 0, 이전 날짜 -1, 이후 날짜 1 반환

3. Calendar

3.0.1. add / roll 메서드

  • add(int field, int amount) - 원하는 만큼 증가 또는 감소
    증가시 31일을 넘기면 다음달로 넘어가므로 MONTH값이 증가
  • roll(int field, int amount) - 다른 필드에 영향을 미치지 않음
    월 필드의 값을 변하지 않고, 일 필드 값만 바뀜
    BUT, 일 필드가 말일 일 때, 월 필드를 변경하면 일 필드에 영향을 미침

3.0.2. 날짜의 연산 (뺄셈)

<java />
package dateAndCalendarTest; import java.util.Calendar; public class CalendarDaySubtraction { public static void main(String[] args) { //요일은 1부터 시작 final String[] DAY_OF_WEEK = {"", "일", "월", "화", "수", "목", "금", "토"}; Calendar cal1 = Calendar.getInstance(); //비교 날짜 Calendar cal2 = Calendar.getInstance(); //현재 날짜 (2023-09-01) cal1.set(2023, 2, 2); System.out.println("비교날짜: " + toString(cal1) + DAY_OF_WEEK[cal1.get(Calendar.DAY_OF_WEEK)] + "요일"); System.out.println("현재날짜: " + toString(cal2) + DAY_OF_WEEK[cal2.get(Calendar.DAY_OF_WEEK)] + "요일"); //두 날짜의 차이 계산 long difference = (cal2.getTimeInMillis() - cal1.getTimeInMillis()) / 1000; System.out.println(difference + "초 지남"); System.out.println(difference/(24*60*60) + "일 지남"); } public static String toString(Calendar date) { return date.get(Calendar.YEAR) + "년 " + (date.get(Calendar.MONTH ) + 1) + "월 " + date.get(Calendar.DATE) + "일 "; } } ----------------------------------------------------------------------------------------------------- 비교날짜: 202332일 목요일 현재날짜: 202391일 금요일 15811200초 지남 183일 지남

3.0.3. 시간의 연산 (뺄셈)

<java />
package dateAndCalendarTest; import java.util.Calendar; public class CalendarTimeSubtraction { public static void main(String[] args) { final int[] TIME_UNIT = {3600, 60, 1}; final String[] TIME_UNIT_NAME = {"시간 ", "분 ", "초 "}; Calendar calTime1 = Calendar.getInstance(); Calendar calTime2 = Calendar.getInstance(); calTime1.set(Calendar.HOUR_OF_DAY, 10); calTime1.set(Calendar.MINUTE, 20); calTime1.set(Calendar.SECOND, 30); System.out.println("비교시간: " + toString(calTime1)); System.out.println("현재시간: " + toString(calTime2)); //두 날짜의 시간 차이 계산 long difference = Math.abs(calTime2.getTimeInMillis() - calTime1.getTimeInMillis()) / 1000; System.out.println(difference + "초 지남"); String tmp = ""; for(int i = 0; i < TIME_UNIT.length; i++) { tmp += difference/TIME_UNIT[i] + TIME_UNIT_NAME[i]; //나머지 시간, 분, 초 difference %= TIME_UNIT[i]; } System.out.println("시분초로 변환시 " + tmp); } public static String toString(Calendar date) { return date.get(Calendar.HOUR_OF_DAY) + "시 " + date.get(Calendar.MINUTE) + "분 " + date.get(Calendar.SECOND) + "초 "; } } ----------------------------------------------------------------------------------------------------- 비교시간: 102030초 현재시간: 1514016870초 지남 시분초로 변환시 4시간 4110

3.1. 달력 출력

<java />
package dateAndCalendarTest; import java.util.Calendar; public class CalendarTest { public static void main(String[] args) { if(args.length != 2) { System.out.println("Usage : java CalendarTest 2023 9"); //args[0]=2023, args[1]=9 return; } int year = Integer.parseInt(args[0]); int month = Integer.parseInt(args[1]); int START_DAY_OF_WEEK = 0; //1일의 요일 int END_DAY = 0; //마지막 일 Calendar sDay = Calendar.getInstance(); Calendar eDay = Calendar.getInstance(); //0~11 sDay.set(year, month-1, 1); //9월 1일 eDay.set(year, month, 1); //10월 1일 //다음 달의 1일에서 하루를 빼면 이번 달의 마지막 일 eDay.add(Calendar.DATE, -1); //9월 30일 START_DAY_OF_WEEK = sDay.get(Calendar.DAY_OF_WEEK); END_DAY = eDay.get(Calendar.DATE); //eDay에 지정된 날짜 System.out.println(" " + args[0] + "년 " + args[1] + "월"); System.out.println(" SU MO TU WE TH FR SA"); 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(); } } } ---------------------------------------------------------------------------------- 20239월 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
  • eDay.add(Calendar.DATE, -1); 말고
    getActualMaximum(Calendar.DATE) 메서드를 사용해서 해당 월의 마지막 날짜 구하기 가능

4. DecimalFormat

  • java.text 패키지의 형식화 클래스
  • 형식화된 데이터의 패턴만 정의해주면 복잡한 문자열에서도 subString() 사용하지 않고 원하는 값 얻기 가능
  • 숫자 → 정수, 부동소수점, 금액 등으로 표현 가능

4.1. 사용1 - 문자 출력

<java />
package dateAndCalendarTest; import java.text.DecimalFormat; public class DecimalFormatTest { public static void main(String[] args) { double number = 1234567.89; DecimalFormat df = new DecimalFormat("#.#E0"); String result = df.format(number); System.out.println(result); } } ------------------------------------------------------- 1.2E6
  • 출력 형식의 패턴 작성하여 DecimalFormat 인스턴스 생성 후, 출력하고자 하는 문자열로 format 메서드 호출

4.2. 사용2 - 숫자 출력

  • Integer.parse 메서드는 콤마(,)가 포함된 문자열을 숫자로 변환 X
<java />
package dateAndCalendarTest; import java.text.DecimalFormat; public class DecimalFormatTest2 { public static void main(String[] args) { DecimalFormat df1 = new DecimalFormat("#,###.##"); DecimalFormat df2 = new DecimalFormat("#.###E0"); try { Number num = df1.parse("1,234,567.89"); System.out.print("1,234,567.89" + " → "); double d = num.doubleValue(); System.out.print(d + " → "); System.out.println(df2.format(num)); } catch (Exception e) {} } } ----------------------------------------------------------- 1,234,567.891234567.891.235E6
  • parse(String source)는 DecimalFormat의 조상인 NumberFormat에 정의된 메서드
  • Number 클래스는 Integer, Double의 래퍼 클래스의 조상
  • doubleValue()는 Number에 저장된 값을 double 형으로 변환하여 반환
728x90
profile

원지의 개발

@원지다

250x250