측정용 시간
1970년 1월 1일 0시 0분 0초(기준시) 부터 지금까지 흘러온 밀리초(ms)
import java.time.LocalDate;
import java.util.Calendar;
import java.util.Date;
public class Test01 {
public static void main(String[] args) }
long a = System. currentTimeMillis(); // 결과를 / 1000 / 60 / 60 / 24 / 365로 나눠야 현재 년도가 나온다.
System.out.println("a = " + a);
최초로 등장한 시간 클래스
1900년을 기준으로 하므로 현재는 버려진 기능이 많음.
한 번 지정된 날짜는 변경이 불가능하다.
월이 0부터 시작하므로 사용을 권장하지 않음.
Date()의 가장 큰 문제점은 계산 기능이 어렵다.
현재 시각을 원하는 방식을 출력하는데 주로 사용한다.
포맷 설정용 클래스를 이용하면 원하는 형식으로 변환하여 출력이 가능하다.(java.text.SimpleDateFormat)
java api 17버전 사이트를 들어가서 java.util.Date를 검색해보면 Deprecated : 사용을 권장하지 않음이 많다.
Date b = new Date();
System.out.println("b = " + b);
Deprecated : 사용을 권장하지 않음. (java api사이트 Instance Method에서)
Date c = new Date(12, 1, 16);
System.out.println("c = " + c);
Date를 개선한 클래스
생성 대행 방식을 사용
지정된 날짜는 변경이 가능하므로 날짜 계산에 특화 되어있다.
월이 0부터 시작한다.
Calendar d = Calendar.getInstance();
System.out.println("d = " + d);
날짜를 바꾸고 싶을 때
d.set(2023, 5, 13);
System.out.println(d.getTime());
날짜만, 시간만, 날짜와 시간을 같이 쓰고 싶은 경우에 맞게 구성
월도 일반적인 방식으로 설정 가능
Time은 기술적 한계로 Date와 Calendar를 더 우선적으로 사용한다.
LocalDate f = LocalDate.now();
LocalDate g = LocalDate.of(2023, 1, 16);
System.out.println("f = " + f);
System.out.println("g = " + g);
}
}
예시1)
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test02 {
public static void main(String[] args) {
Date a = new Date();
System.out.println("a = " + a);
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("f = " + f.format(a));
예시2)
public class Test03_2 {
public static void main(String[] args) {
try(Scanner sc = new Scanner(System.in);){
System.out.print("날짜 입력 : ");
String input = sc.next();
//String 날짜 형식을 Date로 변환할 수 있다(SimpleDateFormat 고유 기능)
//SimpleDateFormat에 고유 기능은 업캐스팅에서 사용을 할 수 없다. (Format 사용 불가)
//parse를 사용해서 역으로 계산하는 것이 되지만 예외 처리를 해줘야 한다.
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd");
Date time = parser.parse(input);
//객체 생성
Calendar c = Calendar.getInstance();
//기준 날짜로 변경(2023.06.13)
c.setTime(time);
//D-100 계산
c.add(Calendar.DATE, -100);
Format f = new SimpleDateFormat("yyyy-MM-dd E");
System.out.println(f.format(c.getTime()));
}
catch(Exception e) {
e.printStackTrace();
}
}
}
변환 기본 언어 설정
import java.util.Date;
import java.util.Locale;
import java.text.Format;
import java.text.SimpleDateFormat;
public class Test03 {
public static void main(String[] args) {
//현재시각을 다음 날짜 형식으로 출력해보세요.
1) 포맷의 날짜에 언어를 바꿔서 출력 할 수 있다.
Locale.setDefault(Locale.CANADA_FRENCH);
Date a = new Date();
//System.out.println("a = " + a);
1. 2023년 1월 16일 월
- 앞으로 java api 사이트에서 최상위 클래스를 찾아서 업캐스팅으로 코드 작성 권장한다.
- SimpleDateFormat b = new SimpleDateFormat("y년 M월 d일 E");
Format b = new SimpleDateFormat("y년 M월 d일 E");
System.out.println("b = " + b.format(a));
2. 오전 10시 40분
- 참고 : 시간을 H, h를 사용한다.
Format c = new SimpleDateFormat("a h시 m분");
System.out.println("c = " + c.format(a));
3. 10:40:35
Format d = new SimpleDateFormat("HH:mm:ss");
System.out.println("d = " + d.format(a));
4. 2023-01-16 월 10:40:35
Format f = new SimpleDateFormat("yyyy-MM-dd E HH:mm:ss");
System.out.println("f = " + f.format(a));
}
}
import java.util.Date;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class Test01 {
public static void main(String[] args) {
//Calendar c = new Calendar(); //직접 생성 불가
Calendar c = Calendar.getInstance(); //생성 의뢰
//출력하는 방법
1) 정보를 하나씩 꺼내어 출력
- .get(항목(상수)) 명령으로 원하는 항목을 추출한다.
- 반드시 추출할 항목에 대한 정보를 인자로 전달한다.
int year = c.get(Calendar.YEAR);
System.out.println("year = " + year);
(주의) 월은 0~11로 관리되므로 실제 설정/추출 시 보정을 해야 한다.
int month = c.get(Calendar.MONTH) + 1;
System.out.println("month = " + month);
int day = c.get(Calendar.DATE);
//int day = c.get(Calendar.DAY_OF_MONTH); //Calendar.DATE와 같은 값이다.
System.out.println("day = " + day);
2) java.util.Date로 변경하여 출력
Date d = c.getTime();
Format f4 = new SimpleDateFormat("yyyy-MM-dd E H:mm:ss");
System.out.println(f4.format(d));
}
}
public class Test01 {
public static void main(String[] args) {
LocalDate a1 = LocalDate.now();
System.out.println(a1.getYear());
System.out.println(a1.getMonthValue());
System.out.println(a1.getDayOfMonth());
System.out.println(a1.getDayOfWeek());
//LocalDate.parse()를 사용하여 특정 날짜를 지정해서 가져올 수 있다.
LocalDate a2 = LocalDate.of(2023, 6, 13);
System.out.println(a2);
//LocalDate.parse()를 사용하여 String 타입 날짜를 LocalDate 타입 날짜로 변환 가능하다.
//LocalDate a3 = LocalDate.parse("2023-06-13");
System.out.println(a3);
//차이 계산
//Period : 연, 월, 일 계산 가능
Period period = Period.between(a1, a3);
System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());
}
}
public class Test02_1 {
public static void main(String[] args) throws ParseException {
//사용자에게 시작, 종료시각을 HH:mm 형태로 입력받아 이용시간을 계산하여 출력
//이용시간은 분으로 출력하며 한시간당 1000원으로 요금을 계산하여 이용요금도 출력
//(참고) LocalTime은 Duration 클래스로 차이를 구할 수 있으며 필요시 인터넷 검색
Scanner sc = new Scanner(System.in);
System.out.print("시작 시간(HH:mm) : ");
String startTime = sc.next();
System.out.print("종료 시간(HH:mm) : ");
String finishTime = sc.next();
sc.close();
//객체 생성
Calendar c = Calendar.getInstance();
//처리
LocalTime start = LocalTime.parse(startTime);
LocalTime finish = LocalTime.parse(finishTime);
Duration duration = Duration.between(start, finish);
long second = duration.getSeconds();
long minute = second / 60L;
int pricePerHour = 1000;
double pricePerMinute = pricePerHour / 60.0;
long price = (long)(pricePerMinute * minute);
//출력
System.out.println("이용시간(분) : " + minute + "분");
System.out.println("이용요금(원) : " + price + "원");
(추가) java.text.DecimalFormat 클래스를 사용하여 숫자 형식을 정의
- #은 해당 자리가 있으면 출력, 없으면 비워두는 형식
- 0은 해당 자리가 있으면 출력, 없으면 0으로 출력하는 형식
- ,는 그룹 표시 형식이며 패턴이 자동으로 설정됨
- .은 소수점 표시 형식
Format f = new DecimalFormat("#,##0.00");
System.out.println(f.format(price));
}
}
배열 정렬
Arrays는 원시형과 문자열은 오름차순 정렬이 가능하다.
다른 방식이나 객체일 경우는 정렬 기준을 따로 구현해야 한다.
java.util.Comparator를 사용하여 정렬 기준을 생성한다.
Arrays.sort() 라이브러리를 사용하면 데이터 변경이 불가하다.
Lamda(람다)를 사용하여 코드를 아래와 같이 간소화 할 수 있다.
public class Test02_4 {
public static void main(String[] args) {
Integer[] data = new Integer[] {30, 50, 20, 10, 40};
//Arrays.sort(data); //무조건 오름차순
Arrays.sort(data, (o1, o2) -> o2 - o1); //우측에 정의된 기준에 따라 정렬
System.out.println(Arrays.toString(data));
}
}
목표 : 단어 형태와 줄 단위 입력을 같이 사용하려면?
.next() 계열 사용 후 nextLine() 메소드를 부르면 입력이 안된다.
입력이 안되는 이유는 구분하는 기호가 다르기 때문이다.
사이에 .nextLine()을 1회 더 추가해서 남긴 쓰레기를 제거해줘야 한다.
public class Test04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("숫자 입력 : ");
int a = sc.nextInt();
System.out.print("단어 입력 : ");
String b = sc.next();
//이전 입력에서 남긴 쓰레기를 제거해야 아래에 String c = sc.nextLine();이 실행된다.
sc.nextLine();
System.out.print("문장 입력 : ");
String c = sc.nextLine();
sc.close();
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("c = " + c);
}
}