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
2023년 8월 1일
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());
}
}
}
-----------------------------------------------------------------------------------------------
13시 2분
기준 날짜: 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) + "일 ";
}
}
-----------------------------------------------------------------------------------------------------
비교날짜: 2023년 3월 2일 목요일
현재날짜: 2023년 9월 1일 금요일
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) + "초 ";
}
}
-----------------------------------------------------------------------------------------------------
비교시간: 10시 20분 30초
현재시간: 15시 1분 40초
16870초 지남
시분초로 변환시 4시간 41분 10초
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();
}
}
}
----------------------------------------------------------------------------------
2023년 9월
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.89 → 1234567.89 → 1.235E6
- parse(String source)는 DecimalFormat의 조상인 NumberFormat에 정의된 메서드
- Number 클래스는 Integer, Double의 래퍼 클래스의 조상
- doubleValue()는 Number에 저장된 값을 double 형으로 변환하여 반환
728x90
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] java.io 패키지 - 로그 파일에서 ip 접속 횟수 출력 (0) | 2023.07.05 |
---|---|
[Heap] Priority Queue(우선 순위 큐) (0) | 2023.06.12 |
[Java] Enum(열거형) (0) | 2023.06.08 |
진법 변환 / StringBuilder & StringBuffer / Arrays.stream (0) | 2023.05.07 |
[Java] 정규 표현식, Network (0) | 2022.10.31 |