⦁ 날짜와 시간
- java.util.Date
날짜와 시간을 다룰 목적으로 만들어진 클래스(JDK 1.0)
Date의 메소드는 거의 deprecated되었지만, 여전히 쓰이고 있다.
- java.util.Calendar
Date클래스를 개선한 새로운 클래스(JDK1.1). 여전히 단점이 존재
- java.time패키지
Date와 Calendar의 단점을 개선한 새로운 클래스들을 제공(JDK1.8)
-> 날짜와 시간을 따로 다룰 수 있음
⦁ Calendar 클래스
- 추상 클래스이므로 getInstance()를 통해 구현된 객체를 얻어야 한다.
Calendar cal = new Calendar(); // 에러, 추상클래스는 인스턴스를 생성할 수 없다.
Calendar cal = Calendar.getInstance();
// getInstance() 메소드는 Calendar클래스를 구현한 클래스의 인스턴스를 반환한다.
⦁ Calendar클래스 – 예제1
- get()으로 날짜와 시간 필드 가져오기 – int get(int field)
Calendar cal = Calendar.getInstance(); // 현재 날짜와 시간으로 셋팅됨
int thisYear = cal.get(Calendar.YEAR); // 올해가 몇 년인지 알아낸다.
int lastDayOfMonth = cal.getActualMaximum(Calendar.DATE); // 이 달의 마지막날
- Calendar에 정의된 필드
[날짜]
* MONTH : 0부터 시작함. +1을 해줘야 됨
WEEK_OF_YEAR : 1월 1일부터 오늘 까지 몇 번째 주인지
WEEK_OF_MONTH : 그 달의 몇 번째 주인지
DAY_OF_YEAR : 그 해의 몇 번째 일인지
DAY_OF_WEEK : 요일 (1~7의 값을 가지는데, 1이 일요일임)
DAY_OF_WEEK_IN_MONTH : 그 달의 몇 번째 요일인지
[시간]
ex)
import java.util.Calendar;
public class Ex10_1 {
public static void main(String[] args) {
Calendar today = Calendar.getInstance();
System.out.println("년도 : "+today.get(Calendar.YEAR));
System.out.println("월(0~11, 0은 1월) : "+today.get(Calendar.MONTH));
System.out.println("올 해의 몇번째 주? : "+today.get(Calendar.WEEK_OF_YEAR));
System.out.println("이번 달 몇번째 주? : "+today.get(Calendar.WEEK_OF_MONTH));
// DATE와 DAY_OF_MONTH는 같다.
System.out.println("오늘이 몇 일? : " + today.get(Calendar.DATE));
System.out.println("오늘이 몇 일? : " + today.get(Calendar.DAY_OF_MONTH));
System.out.println("올해의 몇 일? : " + today.get(Calendar.DAY_OF_YEAR));
System.out.println("오늘은 무슨요일?(1~7, 1은 일요일) : "+ today.get(Calendar.DAY_OF_WEEK));
System.out.println("이 달의 몇번째 요일? : " + today.get(Calendar.DAY_OF_WEEK_IN_MONTH));
System.out.println("오전_오후(0:오전, 1:오후): "+ today.get(Calendar.AM_PM));
System.out.println("시간(0~11) : " + today.get(Calendar.HOUR));
System.out.println("시간(0~23) : " + today.get(Calendar.HOUR_OF_DAY));
System.out.println("분(0~59) : " + today.get(Calendar.MINUTE));
System.out.println("초(0~59) : " + today.get(Calendar.SECOND));
System.out.println("1000분의 1초(0~999) : " + today.get(Calendar.MILLISECOND));
// 천분의 1초 단위를 시간 단위로 표시하기위해 60*60*1000으로 나누었다. (1시간 = 60*60초)
System.out.println("TimeZone(-12~+12) : " + (today.get(Calendar.ZONE_OFFSET)/(60*60*1000)));
System.out.println("이 달의 마지막 날 : " + today.getActualMaximum(Calendar.DATE));
}
}
- set()으로 날짜와 시간 지정하기
void set(int field, int value)
void set(int year, int month, int date)
void set(int year, int month, int date, int hourOfDay, int minute)
void set(int year, int month, int date, int hourOfDay, int minute, int second)
- 날짜 지정하는 방법. 월(MONTH)이 0부터 시작한다는 점에 주의(배열을 이용하기 때문)
Calendar date1 = Calendar.getInstance();
data1.set(2017, 7, 15); // 2017년 8월 15일
// date1.set(Calendar.YEAR, 2007);
// date1.set(Calendar.MONTH. 7);
// date1.set(Calendar.DATE, 15);
- 시간 지정하는 방법
Calendar time1 = Calendar.getInstance();
time1.set(Calendar.HOUR_OF_DAY, 10);
time1.set(Calendar.MINUTE, 20);
time1.set(Calendar.SECOND, 30);
ex)
import java.util.Calendar;
public class Ex10_3 {
public static void main(String[] args) {
final int[] TIME_UNIT = {3600, 60, 1}; // 큰 단위를 앞에 놓는다.
final String[] TIME_UNIT_NAME = {"시간", "분", "초"};
Calendar time1 = Calendar.getInstance();
Calendar time2 = Calendar.getInstance();
time1.set(Calendar.HOUR_OF_DAY, 10); // time1을 10시 20분 30초로 설정
time1.set(Calendar.MINUTE, 20);
time1.set(Calendar.SECOND, 30);
time2.set(Calendar.HOUR_OF_DAY, 20); // time2를 20시 30분 10초로 설정
time2.set(Calendar.MINUTE, 30);
time2.set(Calendar.SECOND, 10);
System.out.println("time1 :" + time1.get(Calendar.HOUR_OF_DAY)+"시 "
+time1.get(Calendar.MINUTE)+"분 "+time1.get(Calendar.SECOND)+"초");
System.out.println("time2 :" + time2.get(Calendar.HOUR_OF_DAY)+"시 "
+time2.get(Calendar.MINUTE)+"분 "+time2.get(Calendar.SECOND)+"초");
long difference = Math.abs(time2.getTimeInMillis() - time1.getTimeInMillis()) / 1000;
System.out.println("time1과 time2의 차이는 "+ 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+"입니다.");
}
}
- clear()는 Calendar객체의 모든 필드를 초기화 한다.
=> 1970년 1월 1일 00:00:00 으로 초기화 됨.
Calendar dt = Calendar.getInstance();
// Thu Mar 17 15:38:31 KST 2022
System.out.println(new Date(dt.getTimeInMillis()));
dt.clear();
// Thu Jan 01 00:00:00 KST 1970
System.out.println(new Date(dt.getTimeInMillis()));
- clear(int field)는 Calendar객체의 특정 필드를 초기화
Calendar dt = Calendar.getInstance();
System.out.println(new Date(dt.getTimeInMillis()));
// Thu Mar 17 15:38:31 KST 2022
dt.clear(Calendar.SECOND);
dt.clear(Calendar.MINUTE);
dt.clear(Calendar.HOUR_OF_DAY);
dt.clear(Calendar.HOUR);
System.out.println(new Date(dt.getTimeInMillis()));
//Thu Mar 17 12:00:00 KST 2022
(??)의문점 : dt.clear(Calendar.HOUR_OF_DAY); / dt.clear(Calendar.HOUR);
두 개를 같이 써야 시간이 초기화가 되는데 그것도 12:00:00, 그러니까 12시로 초기화가 됨
ex)
import java.util.Calendar;
public class Exercise10_5 {
static int getDayDiff(String yyyymmdd1, String yyyymmdd2) {
int diff = 0;
try {
int year1 = Integer.valueOf(yyyymmdd1.substring(0,4));
int month1 = Integer.valueOf(yyyymmdd1.substring(4,6)) - 1;
int day1 = Integer.valueOf(yyyymmdd1.substring(6, 8));
int year2 = Integer.valueOf(yyyymmdd2.substring(0,4));
int month2 = Integer.valueOf(yyyymmdd2.substring(4,6)) - 1;
int day2 = Integer.valueOf(yyyymmdd2.substring(6, 8));
Calendar date1 = Calendar.getInstance();
Calendar date2 = Calendar.getInstance(); // 두 날짜에 밀리세컨드 차이가 약간 발생
date1.clear();
date2.clear(); // clear를 해서 밀리세컨드 차이를 없애야 함
date1.set(year1, month1, day1);
date2.set(year2, month2, day2);
diff = (int) ((date1.getTimeInMillis() - date2.getTimeInMillis()) / (1000*24*60*60));
} catch (Exception e) {
diff = 0; // substring(), valueof() 에서 예외가 발생하면 0을 반환한다.
}
return diff;
}
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")); // 오류라서 0
}
}
- add()는 특정 필드의 값을 증가 또는 감소(다른 필드에 영향O)
* 필드 읽기 – get() / 필드 변경 – set() / 필드초기화 – clear()
Calendar date = Calendar.getInstance();
date.clear(); // 모든 필드를 초기화
date.set(2020, 7, 31); // 2020년 8월 31일로 설정
date.add(Calendar.DATE, 1); // 날짜(DATE)에 1을 더한다. 9월 1일이 됨!
date.add(Calendar.MONTH, -8); // 월(MONTH)에서 8을 뺀다.
- roll()은 특정필드의 값을 증가 또는 감소(다른 필드에 영향X)
date.set(2020, 7, 31); // 2020년 8월 31일로 설정
// add()와 달리 roll()은 다른 필드에 영향을 미치지 않는다.
date.roll(Calendar.DATE, 1); // 날짜(DATE)에 1을 더한다. 그래도 8월1일이 됨.
date.roll(Calendar.MONTH, -8); // 월(MONTH)에서 8을 뺀다. 그래도 2020년 12월이 됨.
ex) 달력 만들기
import java.util.Calendar;
public class Ex10_5 {
public static void main(String[] args) {
if(args.length !=2) {
System.out.println("Usage : java Ex10_5 2022 3");
return;
}
int year = Integer.valueOf(args[0]);
int month = Integer.valueOf(args[1]);
int START_DAY_OF_WEEK = 0;
int END_DAY = 0;
Calendar sDay = Calendar.getInstance(); // 시작일
Calendar eDay = Calendar.getInstance(); // 끝일
// 월의 경우 0부터 11까지의 값을 가지므로 1을 빼주어야 한다.
// 예를 들어, 2019년 11월 1일은 sDay.set(2019, 10, 1);과 같이 해줘야 한다.
sDay.set(year, month-1, 1);
eDay.set(year, month, 1);
// 다음달의 첫날(12월 1일)에서 하루를 빼면 현재달의 마지막 날(11월 30일)이 된다.
eDay.add(Calendar.DATE, -1);
// 첫 번째 요일이 무슨 요일인지 알아낸다.
START_DAY_OF_WEEK = sDay.get(Calendar.DAY_OF_WEEK);
// eDay에 지정된 날짜를 얻어온다.
END_DAY = eDay.get(Calendar.DATE);
System.out.println(" " + args[0] + "년 " + args[1] + "월");
System.out.println(" SU MO TU WE TH FR SA");
// 해당 월의 1일이 어느 요일인지에 따라서 공백을 출력한다.
// 만을 1일이 수요일이라면 공백을 세 번 찍는다.(일요일부터 시작)
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();
}
}
}
}
* 달력 만드는 방법
① 말일 구하기 ② 1일의 요일 구하기 ③ 앞에 공백 출력하고 7일마다 줄바꿈 해주기
⦁ Date와 Calendar간의 변환
- Date의 메소드는 대부분 deprecated되었지만 여전히 사용할 때가 있다.
1. Calendar를 Date로 변환
Calendar cal = Calendar.getInstance();
...
Date d = new Date(cal.getTimeInMillis()); // Date(long date)
2. Date를 Calendar로 변환
Date d = new Date();
...
Calendar cal = Calendar.getInstance();
cal.setTime(d);
⦁ 형식화 클래스
- java.text패키지의 DecimalFormat(10진수 숫자), SimpleDateFormat(날짜 형식화)
- 숫자와 날짜를 원하는 형식으로 쉽게 출력 가능(숫자, 날짜 -> 형식 문자열)
double number = 1234567.89;
DecimalFormat df = new DecimalFormat("#.#E0"); // 지수형식
String result = df.format(number); // result = "1.2E6"
- 형식 문자열에서 숫자와 날짜를 뽑아내는 기능(형식 문자열 -> 숫자, 날짜)
DecimalFormat df = new DecimalFormat("#,###.##"); // 형식
Number num = df.parse("1,234,567.89");
double d = num.doubleValue(); // 1234567.89
⦁ DecimalFormat
- 숫자를 형식화할 때 사용(숫자 ->형식 문자열)
double number = 1234567.89;
DecimalFormat df = new DecimalFormat("#.#E0"); // 지수형식
String result = df.format(number); // result = "1.2E6"
- 특정 형식의 문자열을 숫자로 변환할 때도 사용(형식 문자열 -> 숫자)
DecimalFormat df = new DecimalFormat("#,###.##"); // 형식
Number num = df.parse("1,234,567.89");
double d = num.doubleValue(); // 1234567.89
* Number는 모든 숫자 래퍼클래스의 최고 조상
* 정리하면,
숫자 -> format() -> 문자열
문자열 -> parse() -> 숫자
ex)
import java.text.DecimalFormat;
public class Ex10_7 {
public static void main(String[] args) {
DecimalFormat df = new DecimalFormat("#,###.##");
DecimalFormat df2 = new DecimalFormat("#.###E0");
try {
Number num = df.parse("1,234,567.89");
System.out.print("1,234,567,89" + " -> ");
double d = num.doubleValue(); // d=1234567.89
System.out.print(d + " -> ");
System.out.println(df2.format(num));
} catch (Exception e) {
e.printStackTrace();
}
}
}
⦁ SimpleDateFormat
- 날짜와 시간을 다양한 형식으로 출력할 수 있게 해준다.
Date today = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
// 오늘 날짜를 yyyy-MM-dd 형태로 변환하여 반환한다.
String result = df.format(today);
- 특정 형식으로 되어 있는 문자열에서 날짜와 시간을 뽑아낼 수도 있다.
DateFormat df = new SimpleDateFormat("yyyy년 MM월 dd일");
DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");
Date d = df.parse("2015년 11월 23일");
String result = df2.format(d);
* 날짜 -> format() -> 문자열
문자열 -> parse() -> 날짜
ex)
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Ex10_9 {
public static void main(String[] args) {
DateFormat df = new SimpleDateFormat("yyyy년 MM월 dd일");
DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");
try {
Date d = df.parse("2019년 11월 23일"); // 문자열을 날짜로 변환
System.out.println(df2.format(d)); // 날짜를 문자열로 변환
} catch (Exception e) {}
}
}
출처 - 유튜브 남궁성의 정석코딩 [자바의 정석 - 기초편]
'Java > Java의 정석' 카테고리의 다른 글
220321 Java - Chapter.11 Collections Framework Part.2 (0) | 2022.03.21 |
---|---|
220319 Java - Chapter 11. Collections Framework Part.1 (0) | 2022.03.19 |
220315 Java - Chapter 9. java.lang패키지와 유용한 클래스 (0) | 2022.03.15 |
220314 Java - Chapter 8. 예외 처리(이어서 마무리) (0) | 2022.03.14 |
220312 Java - Chapter 8. 예외 처리 (0) | 2022.03.13 |