공부기록/자바의 정석

[Java의 정석] 10. 날짜와 시간 & 형식화

박윤서 2022. 6. 26. 22:10

1.     날짜와 시간

 

1.1  CalendarDate

Calendar는 추상클래스이기 때문에 직접 객체 생성할 수 없고, 메서드를 통해서 완전히 구현된 클래스의 인스턴스를 얻어야 한다.

Calendar cal = Calendar.getInstance();
//Calendar를 Date로 변환

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

//Date를 Calendar로 변환

Date d = new Date();
Calendar cal = Calendar.getInstace();
cal.setTime(d)

주의할 점: get(Calendar.MONTH)로 얻어오는 값의 범위가 1~12가 아닌 0~11이다,

 

2.     형식화 클래스

 

2.1 DecimalFormat

Format 설명
0 10진수, 값이 없는 자리는 0으로 채움
# 10진수, 값이 없는 자리는 나타나지 않음
. 소수점을 이하 나타냄
- 음수 부호를 나타냄
, 단위 구분자를 나타냄
E 지수 기호를 나타냄, E 이후 0를 써서 표현(ex E0)
% 퍼센트 기호
' escape문자, 만약 #을 문자로 나타내고 싶다면 '#' 으로 표현
그외 문자 문자로 취급
import java.text.*;

class DecimalFormatEx2{
    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();
            System.out.print(d + "->");

            System.out.println(df2.format(num));
        } catch (Exception e){}
    }
}

 

2.2 SimpleDateFormat

문자 날짜 및 시간 요소  표시 예제
G Era designator Text AD
y Year Year 1996; 96
Y Week year Year 2009; 09
M Month in year (context sensitive) Month July; Jul; 07
L Month in year (standalone form) Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day name in week Text Tuesday; Tue
u Day number of week (1 = Monday, ..., 7 = Sunday) Number 1
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800
X Time zone ISO 8601 time zone -08; -0800; -08:00
import java.util.*;
import java.text.*;

class DateFormatEx2{
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        cal.set(2005, 9, 3);

        Date day = cal.getTime();

        SimpleDateFormat sdf1, sdf2, sdf3, sdf4;
        sdf1 = new SimpleDateFormat("yyyy-MM-dd");
        sdf2 = new SimpleDateFormat("yy-MM-dd E요일");
        sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        sdf4 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");

        System.out.println(sdf1.format(day));
        System.out.println(sdf2.format(day));
        System.out.println(sdf3.format(day));
        System.out.println(sdf4.format(day));
    }
}

 

2.3 ChoiceFormat

특정 범위에 속하는 값을 문자열로 변환해준다.

import java.text.*;

class ChoiceFormatEx1{
    public static void main(String[] args) {
        double[] limits = {60, 70, 80, 90};
        String[] grades = {"D", "C", "B", "A"};

        int[] scores = {100, 95, 88, 70, 52, 60, 70};

        ChoiceFormat form = new ChoiceFormat(limits, grades);

        for(int i = 0; i<scores.length;i++){
            System.out.println(scores[i]+":"+form.format(scores[i]));
        }
    }
}

 

2.4 MessageFormat

데이터를 정해진 양식에 맞게 출력할 수 있도록 도와준다.

import java.text.*;

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

        Object[] arguments = {
                "이자바","02-123-1234","27","07-09"
        };

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

 

3.     Java.time 패키지

 

3.1 java.time 패키지의 핵심 클래스

시간을 표현 Localtime클래스, 날짜 표현 LocalDate 클래스, 모두 필요시 LocalDateTime클래스, 시간대 다뤄야 하면 ZoneDateTime클래스를 사용한다. Calendar는 날짜와 시간 시간대까지 모두 가지고 있다.

두 날짜간의 차이를 표현하려면 Period, 시간의 차이는 Duration

Java.time패키지에 속한 클래스의 객체를 생성하는 방법은 now() of()를 사용하는 것이다.

 

3.2 LocalDateLocalTime

일 단위나 초 단위로도 지정할 수 있다.

날짜와 시간에서 특정 필드값을 변경하려면, with로 시작하는 메서드를 사용하면 된다. 특정 필드에 값을 더하거나 빼려면 plus()minus()가 있다.

isEqual()를 제공하는 이유는 연표가 다른 두 날짜를 비교하기 위해서이다. 모든 필드가 일치해야 하는 equals와는 달리 isEqual()은 오직 날짜만 비교한다.

 

3.3 Instant

에포크 타임부터 경과된 시간을 나노초 단위로 표현한다.

 

3.4 LocalDateTimeZoneDateTime

LocalDate + LocalTime = LocalDateTime

LocalDateTime + 시간대 = ZonedDateTime

 

-ZoneOffset

UTC로부터 얼마만큼 떨어져 있는지를 표현한다.

 

3.5 TemporalAdjusters

자주 쓰일만한 날짜 계산들을 대신 해주는 메서드를 정의해놓은 것이 TemporalAdjusters클래스이다.

LocalDate today = LocalDate.now();

LocalDate nextMonday = today.with(TemporalAdjusters.next(DayOfWeek.MONDAY));

 

3.6 PeriodDuration

날짜 날짜 = Period

시간 시간 = Duration

Periodbetween()으로 얻을 수 있다.

until()between()과 거의 같은 일을 한다. Between()static메서드이고, until()은 인스턴스 메서드라는 차이가 있다.

PeriodDuration의 변환 메서드

 

3.7 파싱과 포맷

날짜와 시간을 원하는 형식으로 출력하고 해석(파싱)