날짜와 시간 & 형식화

Jaca·2021년 9월 26일
0

날짜와 시간

  • java.util.Date : 날짜와 시간을 다룰 목적으로 만들어진 클래스(JDK1.0), 거의 deprecated 되었지만, 여전히 쓰이고 있다.
  • java.util.Calendar : Date클래스를 개선한 새로운 클래스(JDK1.1), 여전히 단점이 존재한다.

Calendar를 Date로 변환

Calendar cal = Calendar.getInstance();
	...
Date d = new Date(cal.getTimeInMillis());

Date를 Calendar로 변환

Date d = new Date();
	...
Calendar cal = Calendar.getInstance();
cal.setTime(d)
  • Calendar의 get(Calendar.MONTH)는 1~12가 아닌 0~11이다. (0 : 1월, 11 : 12월)
  • Calendar의 get(Calendar.DAY_OF_WEEK)에서 요일은 1부터 시작하여 차례로 일, 월, 화, 수, 목, 금, 토이다.

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)

두 날짜간 차이를 구하기 위해서는 두 날짜가를 최소 단위인 초단위로 변경해서 계산해야한다.
getTimeInMillis() 1/1000초 단위이기 때문에 일 단위를 얻기 위해서는 '24(시간) 60(분) 60(초) * 1000' 의 변환이 필요하다.

형식화 클래스

DecimalFormat

숫자를 형식화 하기 위한 클래스 (정수, 부동소수점, 금액 등)

기호의미패턴결과(1234567.89)
010진수(값이 없을땐 0)0
0.0
0000000000.0000
1234568
1234567.9
0001234567.8900
#10진수#
#.#
##########.####
1234568
1234567.9
1234567.89
.소수점#.#1234567.9
-음수 부호#.#-1234567.9-
-1234567.9
E지수 기호#E0
0E0
##E0
00E0
.1E7
1E6
1.2E6
12E5
;패턴 구분자#,###.##+;#,###.##-1,234,567.89+(양수일 때)
1,234,567.89-(음수일 때)
%퍼센트#.#%123456789%

사용 예

double number  = 123.456789;
		
DecimalFormat df1 = new DecimalFormat("0000.000");
DecimalFormat df2 = new DecimalFormat("####.##");

System.out.println(df1.format(number));
System.out.println(df2.format(number));

/*  
 *  실행결과
 *  0123.457
 *  123.46
 */

SimpleDateFormat

날짜와 시간의 형태를 다양한 형식으로 출력

기호의미보기
G연대(BC, AD)AD
y년도2021
M월(1~12 또는 1월~12월)10 또는 10월, OCT
w년의 몇 번째 주(1~53)50
W월의 몇 번째 주(1~5)3
D년의 몇 번째 일(1~366)100
d월의 몇 번째 일(1~31)15
F월의 몇 번째 요일(1~5)1
E요일
a오전/오후(AM, PM)PM
H시간(0~23)15
k시간(0~23)13
K시간(0~11)10
h시간(1~12)10
m분(0~59)35
s초(0~59)55
S1/1000초(0~999)253
zTime zone(General time zone)GMT+9:00
ZTime zone(RFC 822 time zone)+0900

사용 예

DateFormat df1 = new SimpleDateFormat("yyyy년 MM월 dd일");
DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");

Date d = df1.parse("2020년 1월 6일");		// 문자열을 Date로 변환
String result = df2.format(d));

ChoiceFormat

연속적 또는 불연속적들을 처리하는데 if문이나 switch문을 사용하기 힘들 때 사용

import java.util.*;
import java.text.*;

class ChoiceFormat {
	public static void main(String[] args) {
		double[] limits = {60, 70, 80, 90};	// 낮은 값부터 큰 값의 순서로 적어야한다.
							
		String[] grades = {"D", "C", "B", "A"};	// limits, grades간의 순서와 개수를 맞추어야 한다. 
		
		int[] scores = { 100, 95, 88, 70, 52, 60, 70};

		ChoiceFormat form = new ChoiceFormat(limits, grades);

/*
 * 60~69, 70~79, 80~89, 90~ 의 범위가 지정됨
 */
	}
}

패턴 구분자 #은 경곗값을 포함하고 <는 포함하지 않는다.
예를 들어 String pattern = "60#D|70#c|80<B|90#A"; 가 있다면
90의 값은 A 이지만, 80은 B가 아닌 C 이다.

MessageFormat

데이터를 정해진 양식에 맞게 출력한다.

import java.util.*;
import java.text.*;

class MessageFormat {
	public static void main(String[] args) {
		String msg = "Name: {0} \nTel: {1} \nAge:{2} \nBirthday:{3}";

		Object[] arguments = {
			"홍길동","02-123-1234", "26", "03-17"
		};

		String result = MessageFormat.format(msg, arguments);
		System.out.println(result);
	}
}

java.time 패키지

Date와 Calendar의 단점을 개선한 새로운 클래스들을 제공한다. (JDK1.8)
시간은 LocalTime클래스, 날짜는 LocalDate클래스, 날짜와 시간 모두는 LocalDateTime클래스를 사용한다.

LocalTime, LocalDate

java.time 패키지의 가장 기본이 되는 클래스이며, 나머지 클래스들은 이들의 확장이다.

now( )는 현재 날짜 시간을, of( )는 특정 날짜 시간을 지정할 때 사용한다.

LocalDate today = LocalDate.now(); //오늘의 날짜
LocalDate now = LocalTime.now(); //현재 시간

LocalDate birthDate = LocalDate.of(1999, 12, 31); // 1999년 12월 31일
LocalTime birthTime = LocalTime.of(23, 59, 59); //23tl 59분 59초

특정 필드의 값을 get() 메서드를 통해 가져올 수 있다.

클래스메서드설명
LocalDataint getYear()
int getMonthValue()
Month getMonth()
int getDayOfMonth()
int getDayOfYear()
DayOfWeek getDayOfWeek()
int lengthOfMonth()
int lengthOfYear()
boolean isLeapYear()
년도(1999)
월(12)
월(DECEMBER) getMonth().getValue() = 12
일(31)
같은 해의 1월 1일부터 몇번째 일(365)
요일(FRIDAY) getDayOfWeek().getValue() = 5
같은 달의 총 일수(31)
같은 해의 총 일수
윤년 여부 확인
LocalTimeint getHour()
int getMinute()
int getSecond()
int getNano()
시(23)
분(59)
초(59)
나노초(0)

Period, Duration

Period는 날짜의 차이를, Duration은 시간의 차이를 계산하기 위한 것이다.
두 날짜 또는 시간의 차이를 구할 때는 between( )을 사용한다.

// 두 날짜의 차이 구하기
LocalDate date1 = LocalDate.of(2020, 1, 6);
LocalDate date2 = LocalDate.of(2019, 12, 25);

Period pe = Period.between(date1, date2);

// 두 시각의 차이 구하기
LocalTime time1 = LocalTime.of(00,00,00);
LocalTime time2 = LocalTime.of(12,34,56);

Duration du = Duration.between(time1, time2);

TemporalAdjusters

날짜를 plus(), minus() 메서드를 통해 간단한 계산을 할 수 있지만, 디테일한 계산은 불편하기때문에 자주 쓰일만한 날짜 계산을 정의해 놓은 클래스이다.

메서드설명
firstDayOfNextYear()다음 해의 첫 날
firstDayOfNextMonth()다음 달의 첫 날
firstDayOfYear()올 해의 첫 날
lastDayOfYear()이번 달의 첫 날
lastDayOfMonth()이번 달의 마지막 날
firstInMonth(DayOfWeek dayOfWeek)이번 달의 첫 번째 ?요일
lastIntMonth(DayOfWeek dayOfWeek)이번 달의 마지막 ?요일
previous(DayOfWeek dayOfWeek)지난 ?요일(당일 제외)
previousOrSame(DayOfWeek dayOfWeek)지난 ?요일(당일 포함)
next(DayOfWeek dayOfWeek)다음 ?요일(당일 제외)
next(DayOfWeek dayOfWeek)다음 ?요일(당일 포함)
dayOfWeekInMonth(int ordinal, DayOfWeek dayOfWeek)이번 달의 n번째 ?요일
profile
I am me

0개의 댓글