Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- FCF
- object
- 금리인상
- 객체지향
- 오버라이딩
- 다형성
- 잉여현금흐름
- mco
- S&P500
- 백준
- javascript
- XLF
- 배당성장
- etf
- 인플레이션
- 주식
- 제태크
- 접근제어자
- 프로그래머스
- Java
- 주린이
- 그리디 알고리즘
- 자바
- 현금흐름표
- 알고리즘
- StringBuffer
- 무디스
- 미국주식
- 기업분석
- 금리인하
Archives
- Today
- Total
오늘의하루
[자바의 정석] 날짜와 시간, 형식화 정리 본문
Calendar
Calendar는 java.util.Calendar로 import 할 수 있으며 추상클래스이다.
- getInstance()를 통해 구현된 객체를 얻을 수 있습니다.
import java.util.Calendar
Calendar cal1 = new Calendar(); // Error! 추상클래스는 인스턴스를 생성할 수 없다.
Calendar cal2 = Calendar.getInstance(); // OK!
Date와 Calendar간의 변환
// 1. Calendar를 Date로 변환
Calendar cal1 = Calendar.getInstance();
Date d1 = new Date(cal1.getTimeInMillis()); // Date(long date) 생성자 사용
// 2. Date를 Calendar로 변환
Date d2 = new Date();
Calendar cal2 = Calendar.getInstance();
cal2.setTime(d2);
Calendar의 주요 메서드 - get()
Calendar에서는 get()을 통해 날짜와 시간 필드를 가져올 수 있다.
- int get(int field)
Calendar cal = Calendar.getInstance(); // 지금 날짜와 시간을 가진 인스턴스 생성
int thisYear = cal.get(Calendar.YEAR); // 올해가 몇년도인지 확인
int lastDayOfMonth = cal.getActualMaximum(Calendar.DATE); // 이 달의 마지막 날은 몇일인지 확인
Calendar에 정의된 필드
Field Name | Description |
YEAR | 년 |
MONTH | 월 (0 부터 시작한다.) 예를 들어 1이면 2월이다. |
WEEK_OF_YEAR | 그 해의 몇번째 주 (1월 1일부터 시작) |
WEEK_OF_MONTH | 그 달의 몇번째 주 |
DATE | 일 |
DAY_OF_MONTH | 그 달의 몇번째 일 (DATE랑 같다.) |
DAY_OF_YEAR | 그 해의 몇번째 일 |
DAY_OF_WEEK | 요일 (1~7) (1은 일요일을 의미한다.) |
DAY_OF_WEEK_IN_MONTH | 그 달의 몇번째 요일 |
HOUR | 시간 ( 0 ~ 11 ) |
HOUR_OF_DAY | 시간 ( 0 ~ 23 ) |
MINUTE | 분 |
SECOND | 초 |
MILLISECOND | 1 / 1000 초 |
ZONE_OFFSET | GMT 기준 시차 ※ 한국은 +9 |
AM_PM | 0은 오전, 1은 오후 |
Calendar today = Calendar.getInstance();
System.out.println("올해 년도 " + today.get(Calendar.YEAR)); // 2022
System.out.println("월(0~11, 0은 1월) " + today.get(Calendar.MONTH)); // 9
System.out.println("올 해의 몇번째 주 " + today.get(Calendar.WEEK_OF_YEAR)); // 44
System.out.println("이 달의 몇번째 주 " + today.get(Calendar.WEEK_OF_MONTH)); // 5
System.out.println("이 달의 몇 일 " + today.get(Calendar.DATE)); // 24
System.out.println("이 달의 몇 일 " + today.get(Calendar.DAY_OF_MONTH)); // 24
System.out.println("이 해의 몇 일 " + today.get(Calendar.DAY_OF_YEAR)); // 297
System.out.println("요일 (1~7, 1은 일요일) " + today.get(Calendar.DAY_OF_WEEK)); // 2
System.out.println("이 달의 몇번째 요일 " + today.get(Calendar.DAY_OF_WEEK_IN_MONTH)); // 4
System.out.println("오전 _ 오후 " + today.get(Calendar.AM_PM)); // 0
System.out.println("시간 (0~11) " + today.get(Calendar.HOUR)); // 3
System.out.println("시간 (0~23) " + today.get(Calendar.HOUR_OF_DAY)); // 3
System.out.println("분 (0~59) " + today.get(Calendar.MINUTE)); // 30
System.out.println("초 (0~59) " + today.get(Calendar.SECOND)); // 56
System.out.println("1/1000 초 (0~999) " + today.get(Calendar.MILLISECOND)); // 816
System.out.println("TimeZone(-12 ~ +12) " + today.get(Calendar.ZONE_OF_SET)/(60*60*1000));
// ZONE_OF_SET은 천분의 1초단위로 나오기 때문에 3,600,000으로 나눠서 표시해 주었다.
SYstem.out.println("이 달의 마지막 날 " + today.getActualMaximum(Calendar.DATE); // 31
Calendar의 주요 메서드 - set()
Calendar에서 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 cal = Calendar.getInstance();
cal.set(2017,7,15); // 2017년 8월 15일
// 하나하나 지정하고 싶다면?
cal.set(Calendar.YEAR, 2017);
cal.set(Calendar.MONTH, 7);
cal.set(Calendar.DATE, 15);
날짜를 지정하는 방법 - 예제
class CalendarTest{
final String[] DAY_OF_WEEK = {"","일","월","화","수","목","금","토"};
Calendar date1 = Calendar.getInstance();
Calendar date2 = Calendar.getInstance();
void dateSet(){
date1.set(2022,10,23);
System.out.println("date1 은 " + toString(date1) + DAY_OF_WEEK[date1.get(Calendar.DAY_OF_WEEK)] + "요일이고");
System.out.println("오늘(date2)은 " + toString(date2) + DAY_OF_WEEK[date2.get(Calendar.DAY_OF_WEEK)] + "요일 입니다.");
long diff = (date2.getTimeInMillis() - date1.getTimeInMillis()) / 1000;
System.out.println("date1부터 지금(date2) 까지 " + diff + "초 지났습니다.");
System.out.println("일(day)로 계산하면 " + diff/(24*60*60) + "일 입니다.");
}
public String toString(Calendar date){
return date.get(Calendar.YEAR)+"년"+date.get(Calendar.MONTH)+"월"+date.get(Calendar.DATE)+"일";
}
}
시간을 지정하는 방법을 알아보자
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 22);
cal.set(Calendar.MINUTE, 20);
cal.set(Calendar.SECOND, 30);
// cal의 시간은 지금 22시 20분 30초로 설정되어 있다.
시간을 지정하는 방법 - 예제
class CalendarTest{
final int[] TIME_UNIT = {3600,60,1};
final String[] TIME_UNIT_NAME = {"시간", "분", "초"};
Calendar time1 = Calendar.getInstance();
Calendar time2 = Calendar.getInstance();
void timeSet(){
time1.set(Calendar.HOUR_OF_DAY, 10);
time1.set(Calendar.MINUTE, 20);
time1.set(Calendar.SECOND, 30);
// 10시 20분 30초
time2.set(Calendar.HOUR_OF_DAY, 20);
time2.set(Calendar.MINUTE, 30);
tiem2.set(Calendar.SECOND, 10);
// 20시 30분 10초
System.out.println("time1 : " + time1.get(Calendar.HOUR_OF_DAY) + "시" + time1.get(Calnedar.MINUTE) + "분" + time1.get(Calendar.SECOND) + "초");
System.out.println("time2 : " + time2.get(Calendar.HOUR_OF_DAY) + "시" + time2.get(Calnedar.MINUTE) + "분" + time2.get(Calendar.SECOND) + "초");
long diff = Math.abs(time2.getTimeInMillis() - time1.getTimeInMillis()) / 1000;
System.out.println("time1과 time2의 차이는 " + diff + "초 입니다.");
String tmp = "";
for(int i = 0; i < TIME_UNIT.length; i++){
tmp = tmp + diff/TIME_UNIT[i] + TIME_UNIT_NAME[i];
diff = diff % TIME_UNIT[i];
}
System.out.println("시분초로 변환하면 " + tmp + "입니다.");
}
}
Calendar의 주요 메서드 - clear()
Calendar에서 clear(int field)로 Calendar객체를 초기화 할 수 있다.
- clear()는 Calendar객체의 모든 필드를 초기화 한다.
Calendar cal = Calendar.getInstance();
System.out.println(new Date(cal.getTimeInMillis()));
// Mon Oct 24 03:40:39 GMT 2022
cal.clear();
System.out.println(new Date(cal.getTimeInMillis()));
// Thu Jan 01 00:00:00 GMT 1970
clear(int field)는 Calendar객체의 특정 필드를 초기화 할 수 있다.
Calendar cal = Calendar.getInstance();
System.out.println(new Date(cal.getTimeInMillis()));
// Mon Oct 24 03:41:25 GMT 2022
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MINUTE);
// 밑에 두개를 같이 해줘야 시간이 초기화 된다.
cal.clear(Calendar.HOUR);
cal.clear(Calendar.HOUR_OF_DAY);
System.out.println(new Date(cal.getTimeInMillis()));
// Mon Oct 24 00:00:00 GMT 2022
Calendar의 주요 메서드 - add()
Calendar에서 add()는 특정 필드의 값을 증가 또는 감소 시키며 다른 필드에 영향을 미친다.
Calendar date = Calendar.getInstance();
date.clear();
date.set(2022,7,31); // 2022년 8월 31일
date.add(Calendar.DATE, 1); // 일(day)에 1을 더한다. >> 2022년 9월 1일이된다.
date.add(Calendar.MONTH, -8); // 월(month)에서 8을 뺀다 >> 2022년 1월 1일 된다.
Calendar의 주요 메서드 - roll()
Calendar에서 roll()은 특정 필드의 값을 증가 또는 감소 시키며 다른 필드에 영향을 미치지 않는다.
Calendar date = Calendar.getInstance();
date.clear();
date.set(2020,7,31); 2020년 8월 31일
date.roll(Calendar.DATE, 1); // 일(day)에 1을 더한다. >> 2020년 8월 1일
date.roll(Calendar.MONTH, -8); // 월(month)에서 8을 뺀다. >> 2020년 12월 31일
숫자의 형식화 - DecimalFormat
숫자를 다양한 형식(패턴)으로 출력할 수 있게 해준다.
- Integer.parseInt(), Folat.parsefloat()은 콤마(',')가 포함된 문자열을 숫자로 변환하지 못한다.
double number = 1234567.89;
DecimalFormat df = new DecimalFormat("#.#E0");
String result = df.format(number); // "1.2E6"
1234567.89를 기준으로 한다. | |||
기호 | 의미 | 패턴 | 결과 |
0 | 10진수 값이 없을때는 0 |
0 0.0 0000000000.0000 |
1234568 (반올림) 1234567.9 (첫째 자리 반올림) 0001234567.8900 |
# | 10진수 | # #.# ##########.#### |
1234568 (반올림) 1234567.9 (첫째 자리 반올림) 1234567.89 |
. | 소수점 | #.# | 1234567.9 (첫째 자리 반올림) |
- | 음수 부호 | #.#- -#.# |
1234567.9- -1234567.9 |
, | 단위 구분자 | #,###,## #,####,## |
1,234,567.89 123,4567.89 |
E | 지수 기호 | #E0 0E0 ##E0 00E0 ####E0 0000E0 #.#E0 0.0E0 0.000000000E0 #.#########E0 |
.1E7 1E6 1.2E6 12E5 123.5E4 1235E3 1.2E6 1.2E6 1.234567890E6 1.23456789E6 |
날짜의 형식화 - SimpleDateFormat
날짜와 시간을 다양한 형식으로 출력할 수 있게 해준다.
Date today = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String result = df.format(today); // 2022-10-24
// 오늘 날짜를 yyyy-MM-dd 형태로 변환해서 반환한다.
// 특정 형식으로 되어있는 문자열에서 날짜와 시간을 뽑아 낼수 있다.
DateFormat df2 = new SimpleDateFormat("yyyy년 MM월 dd일");
DateFormat df3 = new SimpleDateFormat("yyyy/MM/dd");
Date d = df2.parse("2015년 11월 23일"); // 문자열을 Date로 변환
String result = df3.format(d); // 2015/11/23
기호 | 의미 | 보기 (예시) |
G | 연대 (BC, AD) | AD |
y | 년도 | 2022 |
M | 월 (1~12 또는 1월~12월) | 10 또는 10월 또는 OCT |
w | 년의 몇번째 주 (1~53) | 50 |
W | 월의 몇번째 주 (1~5) | 4 |
D | 년의 몇번째 일 (1~365) | 120 |
d | 월의 몇번째 일 (1~31) | 15 |
F | 월의 몇번째 요일 (1~5) | 4 |
E | 요일 | 화 |
a | 오전 / 오후 (AM, PM) | PM |
H | 시간 (0~23) | 20 |
k | 시간 (1~24) | 13 |
K | 시간 (0~11) | 10 |
h | 시간 (1~12) | 11 |
m | 분 (0~59) | 35 |
s | 초 (0~59) | 55 |
S | 천분의 일초 (0~999) | 253 |
z | TimeZone(General time zone) | GMT + 9:00 |
Z | TimeZone(RFC 822 time zone) | +0900 |
` | escape 문자 (특수문자를표현하는데 사용) |
없음 |
Date today = new Date(); // 현재 시간과 날짜를 today에 저장
SimpleDateFormat sdf1, sdf2, sdf3, sdf4;
SimpleDateFormat sdf5, sdf6, sdf7, sdf8, sdf9;
sdf1 = new SimpleDateFormat("yyyy-MM-dd"); // 2022-10-24
sdf2 = new SimpleDateFormat("``yy년 MMM dd일 E요일"); // ``22년 OCT 24일 Mon요일
sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); // 2022-10-24 08:43:22.837
sdf4 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a"); // 2022-10-24 08:43:22 AM
sdf5 = new SimpleDateFormat("오늘은 올해의 D번째 날입니다."); // 297 번째 날
sdf6 = new SimpleDateFormat("오늘은 이달의 d번째 날입니다."); // 24 번째 날
sdf7 = new SimpleDateFormat("오늘은 올해의 w번째 주입니다."); // 44 번째 주
sdf8 = new SimpleDateFormat("오늘은 이달의 W번째 주입니다."); // 5 번째 주
sdf9 = new SimpleDateFormat("오늘은 이달의 F번째 E요일입니다."); // 4 번째 Mon 요일
java.time 패키지
Date와 Calendar의 단점을 보완하기 위해 추가된 패키지 (JDK 1.8 부터) 이다.
- 이 패키지에 속한 클래스들은 모두 불변이다.
java.time 패키지의 핵심 클래스
날짜를 표현할 때는 LocalDate, 시간을 표현할 때는 LocalTime을 사용한다.
- 날짜와 시간을 같이 표현하고 싶다면 LocalDateTime을 사용하면 된다.
- 만약 시간대(time-zone)까지 다뤄야 한다면 ZoneDateTime을 사용하면 된다.
- 날짜간의 차이는 Period, 시간의 차이는 Duration을 사용하면 된다.
- now()는 현재 날짜 시간을, of()는 특정 날짜 시간을 지정하는데 사용된다.
LocalDate today = LocalDate.now(); // 오늘의 날짜 (2022-10-24)
LocalTime now = LocalTime.now(); // 현재 시간
LocalDate birthDate = LocalDate.of(1993,3,1); // 1993년3월 1일
LocalTime birthTime = LocalTime.of(23,59,59); // 23시 59분 59초
// 일 단위나 초단위로 지정가능 (1일은 24*60*60)
LocalDate birthDate2 = LocalDate.ofYearDay(1993,365); // 1993년 12월 31일
LocalTime birthTime2 = LocalTime.ofSecondDay(86399); // 23시 59분 59초
// parse()로 문자열을 LocalDate나 LocalTime으로 변환할 수 있다.
LocalDate birthDate3 = LocalDate.parse("1999-12-31"); // 1999년 12월 31일
LocalTime birthTime3 = LocalTime.parse("23:59:59"); // 23시 59분 59초
'JAVA' 카테고리의 다른 글
Java Scanner 대신 BufferedReader 사용해보기 (0) | 2022.11.30 |
---|---|
[Java] 성적 조회 프로그램 만들기 (0) | 2022.11.03 |
[자바의 정석] Object, String, StringBuffer 클래스 정리 (0) | 2022.10.21 |
[자바의 정석] 예외처리 (0) | 2022.10.19 |
[자바의 정석] 추상클래스 인터페이스 내부클래스 정리 (0) | 2022.10.19 |
Comments