JAVA Date 특정 날짜 - JAVA Date teugjeong naljja

SimpleDateFormat에서 쓸 수 있는 것들입니다.

01. 사용법

Date today = new Date();
DateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd");
System.out.println(dateFormat.format(today));

결과 : 년월일 형식으로 출력

또는

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println(df.format(today));

02. 특정 날짜 요일 구하기

String inputDate= "구하고 싶은 날짜";
DateFormat df = new SimpleDateFormat("yyyy.MM.dd");
Date date = df.parse(inputDate);

Calendar cal = Calendar.getInstance();
cal.setTime(date);
System.out.println(Calendar.DAY_OF_WEEK);

참조 : mindols.tistory.com/90

1. Date, Calendar

자바에서 날짜 데이터를 생성하거나 조작할 때 가장 먼저 떠오르는 것, java.util 패키지의 Date 클래스이다.

import java.util.Date;

...

Date currentDate = new Date();

이런 식으로 현재 날짜 데이터를 생성할 수 있다.

특정 날짜를 생성하거나 날짜를 계산할 땐 Calendar 클래스를 사용한다.

import java.util.Calendar;

...

Calendar cal = Calendar.getInstance();
cal.set(2019, Calendar.OCTOBER , 2);
cal.add(Calendar.DATE, 7);

이런 식으로 2019년 10월 2일 날짜를 생성하고 7일을 더할 수 있다.

만약 날짜의 포맷을 바꾸고 싶다면,

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss");
String currentDate = dateFormat.format(new Date());

SimpleDateFormat을 사용하면 된다.

참고로 아래 문서에서 날짜 패턴들을 알 수 있다.

▶Java Platform SE7 - SimpleDateFormat

하지만 이 Date와 Calendar에겐 문제가 있다.

Date만으로 Calendar의 역할을 할 수 없고, Calendar도 Date 객체를 생성하므로 사용에 불편함이 있다.

이뿐만 아니라, 사회 제도나 과학으로 인해 변경되거나 사라진 날짜를 반영하고 있으므로 이 클래스들을 이용하여 날짜를 다루기가 쉽지 않다.

불변 객체가 아니라  외부의 악의적인 코드에 의해 조작될 수도 있다.

▶ 더 자세하고 정확한 내용은 아래 출처 링크에서 확인하길 바란다.

(출처: NAVER D2 - Java의 날짜와 시간 API)

JDK 8부터는 위의 단점들을 보완하는 날짜와 시간 API가 등장하였다.

바로 java.time 패키지이다.

이제 Date 클래스처럼 지금 날짜 데이터를 생성하고, Calendar클래스로 계산하던 것을 java.time 패키지로 대체해보겠다.

2. java.time

java.time 패키지에 LocalDate 클래스가 있다. 시간대를 제외한 날짜를 얻어온다.

(참고로 LocalDateTime과 LocalTime도 있다. 각각 날짜+시간, 시간을 구하는 클래스이다.)

import java.time.LocalDate;

...

LocalDate today = LocalDate.now();

이런 식으로 현재 날짜를 구해올 수 있다.

이틀 후를 계산하려면 다음과 같이 하면 된다.

long days = 2L;
LocalDate twoDaysLater = LocalDate.now().plusDays(days);

plusWeeks, plusMonths, plusYears도 있다.

참고로 java.time 패키지 내에 날짜 포맷을 지정하는 클래스도 있다.

DateTimeFormatter이다.

import java.time.format.DateTimeFormatter;

...

LocalDate currentDate = LocalDate.now();
String currentDateStr = currentDate.format(DateTimeFormatter.ofPattern("yyyy.M.d"));

더 많은 내용은 아래 공식 문서를 참고하면 된다.

Java Platform SE8 - Package java.time

앞으로는 Date와 Calendar 사용을 지양하고, java.time 패키지를 사용하도록 해야겠다.

자바 날짜와 시간 다루기

자바를 기반으로 하는 개발(서버와 안드로이드)에서 날짜를 기반으로 다양한 기능들을 제공해야 할 경우가 있습니다. 그래서 자바에서 날짜 및 시간을 다루는 대표적인 클래스를 정리해보았습니다.

대표적인 클래스   

 Class

 Description 

 java.util.Date

 특정 날짜를 저장한다. 

 java.util.Calendar  

 일시에 대한 다양한 조작을 한다. 

 java.text.SimpleDateFormat 

 지정한 서식에 따라 문자열을 Date 클래스로 변환하거나, 그 반대로 처리한다. 

특정 날짜를 저장하는 Date 클래스

Date 클래스를 이용해 현재 날짜와 시간을 콘솔화면에 촐력해 보면 그 시점의 날짜와 시간이 인스턴스에 저장됨 알 수있습니다. 다만 이런식으로 사용되는 것은 시스템 날짜를 가져올 때 정보입니다.

import java.util.Date;

public class Test {
    public static void main(String[] args) {
        Date now = new Date();
        System.out.println(now);
    }
}

실행 결과

Sat Sep 16 00:03:48 KST 2017

특정 날짜를 지정하고 설정할 수 있는 Calendar

임의의 날짜를 생성할 때는 Calendar 클래스를 사용합니다. Calendar 클래스는 인스턴스를 만드는 방법이 독특합니다. new 생성자를 이용한 것이 아니라 .getInstance()를 이용하여 인스턴스를 가져오고 있습니다. Calendar은 new 생성자로 인스턴스를 생성할 수 없습니다.

Calendar의 add함수를 이용하여 특정 날짜의 앞 뒤로 이동하기

import java.util.Calendar;
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DAY_OF_MONTH, 1);
        
        //출력용으로 Calendar 크래스에서 Date 클래스를 얻는다.
        Date nextDay = cal.getTime();
        System.out.println(nextDay);
    }
}


실행 결과

Sun Sep 17 00:09:31 KST 2017

Calendar 클래스의 add 메서드의 Parameter

void java.util.Calendar.add(int field, int amount)

 Parameter 

 Description 

 field 

 Calendar 클래스의 상수(다음 표를 참고) 

 amount 

 변경될 양을 설정(마이너스 값도 설정 가능) 

Calendar 클래스의 add 메서드의 field

 Field

 Description

 YEAR 

 연

 MONTH 

 월 

 DATE 

 일 

 DAY_OF_MONTH

 일(DATE와 같음) 

 HOUR_OF_DAY 

 24시간제 시간 

 HOUR 

 12시간제 시간 

 MINUTE 

 분 

 SECOND 

 초 

 MILLISECOND

 밀리초 

Calendar의 set함수를 이용하여 특정 날짜로 데이터를 지정하기

아래 출력된 결과의 날짜가 1로 바뀐 것을 알 수 있습니다. add 메서드는 지정된 날짜에서앞 뒤로 이동했지만, set 메서드는 지정된 값이 날짜와 상관없이 설정됩니다. set 메서드는 add 메서드와 달리 마이너스 인자가 올 수 없습니다.

import java.util.Calendar;
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DAY_OF_MONTH, 1);
        
        //출력용으로 Calendar 크래스에서 Date 클래스를 얻는다.
        Date nextDay = cal.getTime();
        System.out.println(nextDay);
    }
}

실행결과

Fri Sep 01 00:21:32 KST 2017

날짜 데이터에서 특정 항목을 추출하기

Calendar에서 날짜 데이터를 추출하기 위해서는 get 메서드를 사용해야 합니다. 

실행 결과를 보면 현재는 9월인데 월이 8로 출력되고 있습니다. 자바에서는 월에서 1을 뺀 값을 가져옵니다. 아래 상수 표를 보셔서 정리하시면 됩니다.

import java.util.Calendar; import java.util.Date; public class Test { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); //출력용으로 Calendar 클래스에서 Date 클래스를 가져옵니다. Date date = cal.getTime(); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH); int day = cal.get(Calendar.DATE); int hour = cal.get(Calendar.HOUR); int minute = cal.get(Calendar.MINUTE); int second = cal.get(Calendar.SECOND); System.out.println(date); System.out.println(year); System.out.println(month); System.out.println(day); System.out.println(day); System.out.println(hour); System.out.println(minute); System.out.println(second); } }


실행 결과

Sat Sep 16 00:35:32 KST 2017
2017
8
16
16
0
35
32

 Field

 Description

 Calendar.YEAR 

 현재 연도

 Calendar.MONTH 

 현재 월 (1월은 0)

 Calendar.DATE 

 현재 월의 날짜 

 Calendar.WEEK_OF_YEAR

 현재 년도의 몇째 주

 Calenda.WEEK_OF_MONTH 

 현재 월의 몇째 주 

 Calendar.DAY_OF_YEAR

 현재 년도의 날짜 

 Calendar.DAY_OF_MONTH

 현재 월의 날짜(DATE와 같음) 

 Calendar.DAY_OF_WEEK

 현재 요일(일요일은 1, 토요일은 7) 

 Calendar.HOUR_OF_DAY 

 현재 시간(24시간제 시간)

 Calendar.HOUR 

 현재 시간(12시간제 시간)

 Calendar.MINUTE 

 현재 분 

 Calendar.SECOND 

 현재 초 

지정 서식으로 날짜를 출력하는 SimpleDateFormat

자바에서는 특정 서식으로 날짜를 출력하기 위해 SimpleDateFormat을 제공하고 있습니다. String 클래스의 format 메소드처럼 서식을 지정해서 출력할 내용을 만들어주고 있습니다. SimpleDateFormat 클래스는 클래스의 생성자로 미리 서식을 설정해 둡니다 나머지는 format 메서드의 인수로 Date 클래스를 넘겨주면 서식에 맞게 날짜를 출력할 수 있습니다.

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        //출력용으로 Calendar 클래스에서 Date 클래스를 가져옵니다.
        Date date = cal.getTime();
        
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        String formatStr = sdf.format(date);
        System.out.println(formatStr);
    }
}

실행 결과

2017/09/16

 Symbol 

 Description

 Example

 y

 year : 년도 

 yy : 14 , yyyy : 2014

 M

 month in year : 월 

 M : 1, MM : 01, MMM : 1월 

 d

 day in month : 일

 d : 1, dd : 01, ddd : 001, dddd : 0001

 h

 hour in am/pm(1-12) : 시

 h : 1  , hh : 01, hhh : 001, hhhh : 0001

 a

 am/pm marker

 a : 오후

(AM/PM 으로 표시하려면 format에서 Locale.US를 지정)

 k

 hour in day (1-24) : 시

 k : 13, kk : 13, kkk : 013, kkkk : 0013

 m

 minute in hour : 분 

 m : 20, mm: 20, mmm : 020, mmmm : 0020

 s

 second in minute : 초

 s : 10, ss : 10, sss : 010. ssss: 0010

 w

 week in year : 주(년기준) 

 w : 1, ww : 01, www :001, wwww : 0001 

 D 

 day in year : 일(년기준)

 D : 1, DD : 01, DDD: 001, DDDD : 0001 

 E

 day of week : 요일

 E : 수

 F

 day of week in month

: 월 기준 주간 요일 순번 

 F : 1, FF : 01, FFF:001, FFFF:0001

 G

 era designator : 시대

 AD 

 H

 hour in day (0-23) : 시 

 H: 13, HH : 13, HHH : 013 , HHHH:0013

 K

 hour in am/pm(0-11) : 시 

 K: 1 , KK : 01, KKK :001, KKKK: 0001 

 S

 fractional seconds : 초

 S : 402 

 W

 week in month : 주 (월기준) 

 W : 1, WW : 01, WWW : 001, WWWW : 0001

 z

 time zone

 z : KST, zzzz: 한국표준시

 Z

 time zone (RFC 822) 

 Z : +0900