📌Date 클래스
Date는 날짜를 표현하는 클래스이다.
Date() 생성자는 컴퓨터의 현재 날짜를 읽어 Date 객체로 만든다.
현재 날짜를 문자열로 얻고 싶다면 toString() 메소드를 사용하면 된다. toString() 메소드는 영문으로 날짜를 리턴하기 때문에 만약에 한글로 출력하고 싶다 던지 혹은 다른 문자열 포맷으로 얻고 싶다면 java.text.SimpleDateFormat 클래스를 이용하면 된다.
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy 년 MM월 dd일 hh시 mm분 ss초");
String strNow = sdf.format(now);
System.out.println(strNow); //2022년 05월 29일 09시 22분 25초
📌Calendar 클래스
Calendar 클래스는 달력을 표현한 클래스이다.
Calendar는 추상클래스이기 때문에 직접 객체를 생성할 수 없다. 그 이유는 날짜와 시간을 계산하는 방법이 나라, 문화에 따라 다르기 때문이다. 예를 들어 우리나라는 양력과 음력이 동시에 사용되고 있다. 때문에 Calendar 클래스에는 날짜와 시간을 계산하는데 필수적인 메소드들만 선언되어 있고, 특정한 날짜와 시간을 계산하는 방법을 구현을 하고 싶을땐, 하위 클래스를 만들면 된다. 특정한 날짜와 시간을 계산하는 경우가 아니라면 직접 하위 클래스를 만들 필요는 없고, Calendar 클래스의 정적 메소드인 getInstance()를 통해 현재 운영체제에 설정되어 있는 시간대를 기준으로 한 Calendar 하위 객체를 얻을 수 있다.
get() 메소드를 이용하여 날짜와 시간에 대한 정보를 얻을 수 있다.
Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR); //년도를 리턴
int month = now.get(Calendar.MONTH)+1; //월을 리턴
int day = now.get(Calendar.DAY_OF_MONTH); //일을 리턴
int week = now.get(Calendar.DAY_OF_WEEK); //요일을 리턴
int amPm = now.get(Calendar.AM_PM); //오전/오후를 리턴
int hour = now.get(Calendar.HOUR); //시를 리턴
int minute = now.get(Calendar.MINUTE); //분을 리턴
int second = now.get(Calendar.SECOND); //초를 리턴
다른 시간대에 해당하는 날짜와 시간을 출력하기 위해서는 어떻게 해야 할까? 예를 들어 미국/LA의 현재 날짜와 시간을 출력하기 위해선 어떻게 해야할까? 운영체제의 시간을 바꾸거나 우리가 시차를 생각하여 직접 바꿔줘도 되지만, Calendar 클래스의 오버로딩된 다른 getInstance() 메소드를 이용하면 간단하게 다른 시간대의 Calendar를 얻을 수 있다. 알고 싶은 시간대의 java.util.TimeZone 객체를 얻어, Calendar.getInstance() 메소드의 매개값으로 넘겨주면 된다.
TimeZone timeZone = TimeZone.getTimeZone("America/Los_Angeles");
Calendar now = Calendar.getInstance(timeZone);
String[] availableIDs = TimeZone.getAvailableIDs();
for(String id : availableIDs){
System.out.println(id);
}
-아래 코드에 대한 설명-
이때 TimeZone.getTimeZone() 메소드의 매개값은 TimeZone 클래스의 정적 메소드인 getAvailableIDs()를 호출하여 출력되는 시간대 문자열 중 하나를 사용하면 된다. getAvailableIDs()메소드의 리턴 타입은 String 배열이기 때문에 다음과 같이 하여 시간대 문자열들을 출력할 수 있다.
📌java.time 패키지
자바 7이전까지는 Date와 Calendar 클래스를 이용하여 날짜와 시간 정보를 이용하였다면, 자바 8부터 날짜와 시간을 나타내는 API가 새로 추가되어, java.time 패키지와 하위 패키지가 이용된다.
java.time 패키지 API
LocalDate | 로컬 날짜 클래스 |
LocalTime | 로컬 시간 클래스 |
LocalDateTiime | 로컬 날짜 및 시간 클래스(LocalDate + LocalTime) |
ZonedDateTime | 특정 타임존(TimeZone)의 날짜와 시간 클래스) |
Instant | 특정 시점의 Time-Stamp 클래스 |
LocalDate
로컬 날짜 정보를 저장할 수 있다. LocalDate 객체는 두 가지 정적 메소드를 얻을 수 있는데, now()는 컴퓨터의 현재 날짜 정보를 저장한 LocalDate 객체를 리턴하고 of()는 매개값으로 주어진 날짜 정보를 저장한 LocalDate 객체를 리턴한다.
LocalDate currDate = LocalDate.now();
LocalDate targetDate = LocalDate.of(int year, int month, int dayOfMonth);
LocalTime
로컬 시간 정보를 저장할 수 있다. now()는 컴퓨터의 현재 시간 정보를 저장한 LocalTime객체를 리턴하고of()는 매개값으로 주어진 시간 정보를 저장한 LocalTime 객체를 리턴한다.
LocalTime currTime = LocalTime.now();
LocalTime targetTIme = LocalTime.of(int hour, int minute, int second, int nanoOfSecond);
LocalDateTime
LocalDate + LocalTime을 결합한 클래스이다.
Instant
특정 시점의 타임스탬프로 사용된다. 주로 특정한 두 시점 간의 시간적 우선순위를 따질 때 사용한다. java.util.Date와 가장 유사한 클래스이지만, 차이점은 Date 로컬 컴퓨터의 현재 날짜와 시간 정보를 기준으로 하지만 Instant는 협정세계시(UTC) 를 기준으로 한다.
날짜와 시간에 대한 정보
클래스 | 메소드 | 설명 |
LocalDate | inr getYear() | 년 |
Month getMonth() | Month 열거값 | |
int getMonthValue() | 월 | |
int getDayOfYear | 일년의 몇 번째 일 | |
int getDayOfMonth() | 월의 몇 번째 일 | |
DayOfWeek getDayOfWeek() | 요일 | |
boolean isLeapYear() | 윤년 여부 | |
LocalTime | int getHour() | 시간 |
int getMinute() | 분 | |
int getSecond() | 초 | |
int getNano() | 나노초 리턴 | |
ZonedDateTime | ZoneId getZone() | 존아이디를 리턴(예: Asia/Seoul) |
ZoneOffset getOffset() | 존오프셋(시차)을 리턴 |
날짜와 시간 조작
클래스 & 리턴 타입 | 메소드 | 설명 |
LocalDate | minusYears(long) | 년 빼기 |
LocalDateTime | minusMonths(long) | |
ZonedDateTime | minusDays(long) | |
minusWeeks(long) | ||
plusYears(long) | ||
plusMonths(long) | ||
plusWeeks(long) | ||
plusDays(long) | ||
withYear(int) | 년 변경 | |
withMonth(int) | ||
withDayOfMonth(int) | 월의 일 변경 | |
withDayOfYear(int) | 년의 일 변경 | |
with(TemporalAdjuster adjuster) | 상대 변경 (나중에 따로 찾아보기.) | |
LocalTime | minusHours(long) | |
LocalDateTime | minusMinutes(long) | |
ZonedDateTime | minusSeconds(long) | |
plusHours(long) | ||
plusMinutes(long) | ||
plusSeconds(long) | ||
plusNanos(long) | ||
withHour(int) | 시간 변경 | |
withMinute(int) | ||
withSecound(int) | ||
withNano(int) |
ex) 현재 날짜와 시간을 얻어 1년을 더하고, 2달을 빼고, 3일을 더하고, 4시간을 더한 날짜와 시간을 얻도록 하시오.
LocalDateTime now = LocalDateTime.now();
LocalDateTime targetDateTime = now.plusYears(1).minusMonths(2).plusDays(3).plusHours(4);
📌Format 클래스
두 가지 예를 들테니 한 번 어떻게 코드를 작성할지 생각해보자.
1. 정수 세 자리마다 쉼표(,)를 넣어야한다면?
정수를 문자열로 변환한 다음, 세 자리 씩 끊어서 쉼표를 넣으면 될 것이다.
2. 많은 수의 점수를 소수점 한 자리로 일정하게 맞추어 리스트하고 싶다면?
각 점수에 10을 곱해서 정수화하고, 다시 10.0으로 나누어 소수점 한 자리로 만들면 될 것이다.
3. 날짜를 원하는 문자열로 출력하기 위해서는?
Calendar로 부터 년, 월, 일, 시, 분, 초를 얻어 원하는 문자열로 조합하면 될 것이다.
Java에서는 위에 번거로운 작업들을 편하게 해결해 주는 방법을 제공하는데 이것이 바로 Format 클래스이다.
Format 클래스는 java.text 패키지에 포함되어 있고, 숫자 형식을 위한 DecimalFormat, 매개 변수화된 문자열 형식을 위한 MessageFormat, 날짜 형식을 위한 SimpleDateFormat 등이 있다.
DecimalFormat
DecimalFormat df = new DecimalFormat("#,###.0");
String result = df.format(1234567.89);
result : 1,234,567.9
0 | 10진수(빈자리는 0) | 0 0.0 00000.000 |
123 123.4 00123.400 |
# | 10진수(빈자리 비워둠) | # #.# #####.### |
123 123.4 123.4 |
. | 소수점 | #.0 | 123.4 |
- | 음수 기호 | +#.0 -#.0 |
+123.4 -123.4 |
, | 단위 구분 | #,###.0 | 1,234,567.8 |
E | 지수 문자 | 0.0E0 | 1.2E6 |
; | 양수와 음수의 패턴을 모두 기술할 경우, 패턴 구분자 | +#,###;-#,### | +1,234(양수일 때) -1,234(음수일 때) |
% | % 문자 | #.# % | 123.4 % |
\u00A4 | 통화 기호 | \u00A4 #,### | \(돈 모양) 1,234,567 |
SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일");
String strDate = sdf.format(new Date());
strDate : 2022년 05월 29일
y | 년 | H | 시(0~23) |
M | 월 | h | 시(1~12) |
d | 일 | K | 시(0~11) |
D | 월 구분이 없는 일(1~365) | k | 시(0~24) |
E | 요일 | m | 분 |
a | 오전/오후 | s | 초 |
w | 년의 몇 번째 주 | S | 밀리세컨드(1/1000초) |
W | 월의 몇 번째 주 |
'Java' 카테고리의 다른 글
[Java] 람다식 (Lambda expression) (0) | 2021.08.07 |
---|---|
[Java] 멀티 스레드 (0) | 2021.08.06 |
[Java]Java.lang 패키지 (Object, System, Class, String, String, Pattern, Arrays, Math, Wrapper) (0) | 2021.08.04 |
Java 스레드(Thread) (0) | 2021.05.05 |
[Java] 컬렉션 (0) | 2021.05.05 |