// java.util

TIL·2023년 1월 11일
0

Java (최은빈)

목록 보기
22/27

StringTokenizer / Scanner / Arrays / Random / Date / Calendar / Locale



Date

특정 시간 저장하는 Date 클래스
스레드에 안전하지 않음 >> java.lang.Long 선호
지역 설정 불가 (절대 시점 시각을 나타내는 객체) // 한국, 유럽, .. 의 시간
대부분의 Date 클래스의 메소드들은 deprecated
이전 버전과의 호환성을 위해 존재함
특정 날짜를 설정하거나 날짜 산술 수행해야하는 경우 =>Calendar 클래스 사용 (지역 설정도 가능)

import java.util.Date;

public class DateExample {
    public static void main(String[] args) {

        // new 로 시간 가져
        Date date = new Date();
        System.out.println("date = " + date); // 현재 시간 출력 // Mon Jan 16 21:08:53 KST 2023

        // getTime() : 초 반환 (ms : 1970년 1월 1일 00:00:00 GMT 이후의 밀리초 수를 반환)
        long time = date.getTime();
        System.out.println("time = " + time + " ms");

        // before() : 인자 값이 date 보다 전이냐
        boolean isBefore = date.before(new Date(2019, 1, 1));
        System.out.println("isBefore = " + isBefore);

        // after() : 후냐
        boolean isAfter = date.after(new Date(2019, 1, 1));
        System.out.println("isAfter = " + isAfter);
        System.out.println();
    }
}



Calendar

특정 시간 저장하는 Calendar 클래스
특정 날짜를 설정하거나 날짜 산술 수행해야하는 경우 사용
지역 설정 가능

  • Calendar 문제점
    1) 불변 객체 (immutable object)가 아니라서 값이 수정될 수 있음
    2) 윤초 (leap second)와 같은 특별한 상황 고려하지 않음
    3) 1월 ~ 12월 -> 0 ~ 11 로 표현 (JAN, FEB, .. -> Enum 으로 저장되어 있기 때문)
    4) 일요일: 1, 토요일: 7

Date, Calendar 대신 => Joda-Time 외부 라이브러리 함께 사용 => 자바가 채택하여 java.time (JDK 8+) 패키지 제공

abstract class Calendar 추상 클래스이기 때문에 직접 new 해서 사용 불가
객체 생성 방법
1. Calendar.getInstance(); 이용
2. Calendar 자식 클래스 GregorianCalendar, BuddhistCalendar (태국에서 이용) 클래스 이용

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;

public class CalendarExample {
    public static void main(String[] args) {
        System.out.println("============================= Calendar Field =============================");
        // getInstance() 로 시간 가져옴 (싱글톤 패턴)
        Calendar calendar = Calendar.getInstance();
        // GregorianCalendar : 윤년을 포함하는 양력
        Calendar gregorianCalendar = new GregorianCalendar();
        // getTime()
        System.out.println("calendar = " + calendar.getTime());
        System.out.println("gregorianCalendar = " + gregorianCalendar.getTime());
        System.out.println();

        int year = calendar.get(Calendar.YEAR); // 현재 년도
        int month = calendar.get(Calendar.MONTH); // 현재 월 (1월: 0)
        int date = calendar.get(Calendar.DATE); // 현재 월의 날짜
        int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR); // 현재 년도의 몇째 주
        int weekOfMonth = calendar.get(Calendar.WEEK_OF_MONTH); // 현재 월의 몇째 주
        int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR); // 현재 년도의 날짜
        int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // 현재 월의 날짜
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); // 현재 요일 (일요일: 1, 토요일: 7)
        int hour = calendar.get(Calendar.HOUR); // 현재 시간 (12시간제)
        int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY); // 현재 시간 (24시간제)
        int amPm = calendar.get(Calendar.AM_PM); // 오전, 오후 리턴 (오전: 0)
        int minute = calendar.get(Calendar.MINUTE); // 현재 분
        int second = calendar.get(Calendar.SECOND); // 현재 초
        int milliSecond = calendar.get(Calendar.MILLISECOND);
        int timeZone = calendar.get(Calendar.ZONE_OFFSET); // https://time.is/ko/UTC와 비교했을 때 +9시간 앞선다는 의미
        int timeDST = calendar.get(Calendar.DST_OFFSET); // https://namu.wiki/w/%EC%84%9C%EB%A8%B8%ED%83%80%EC%9E%84 서머 타임 적용 여부
        int firstDate = calendar.getActualMinimum(Calendar.DATE);
        int lastDate = calendar.getActualMaximum(Calendar.DATE);

        System.out.printf("오늘은 %d년 %d월 %d일\n", year, (month+1), date);
        System.out.printf("오늘은 올해의 %d째주, 이번달의 %d째주, %d일\n", weekOfYear, weekOfMonth, date);
        System.out.printf("오늘은 이번 해의 %d일이자, 이번 달의 %d일, 요일은 %d일 (1: 일요일)\n", dayOfYear, dayOfMonth, dayOfWeek);
        System.out.printf("현재 시각은 %d:%d:%d(%s), 24시간으로 표현하면 %d:%d:%d\n", hour, minute, second,
                (amPm == 0 ? "AM" : "PM"), hourOfDay, minute, second);
        System.out.println();

        System.out.printf("오늘은 %d년 %d월 %d일\n", year, (month+1), date);
        System.out.printf("1000분의 1초 (0 ~ 999): %d\n", milliSecond);
        System.out.printf("timeZone (-12 ~ +12): %d\n", timeZone/(60*60*1000)); // 1000분의 1초를 시간으로 표시하기 위해 60*60*1000
        System.out.printf("summerTime: %s\n", timeDST == 0 ? "not applied" : "applied"); // 1000분의 1초를 시간으로 표시하기 위해 60*60*1000
        System.out.printf("이 달의 첫째 날: %d\n", firstDate);
        System.out.printf("이 달의 마지막 날: %d\n", lastDate);
        System.out.println();
        System.out.println();


        System.out.println("============================= Calendar Method =============================");
        calendar = Calendar.getInstance();
        System.out.println("calendar = " + calendar.getTime());

        // set() : 수정
        calendar.set(2000, 01, 01);
        System.out.println("calendar = " + calendar.getTime());
        System.out.println();

        // SimpleDateFormat.format() : Mon Mar 20 00:00:00 KST 2023 -> yyyy.MM.dd 로 포맷 수
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd", Locale.KOREA);
        Calendar calendar1 = Calendar.getInstance();
        Calendar calendar2 = new GregorianCalendar(1990, 2, 20);
        Calendar calendar3 = new GregorianCalendar(2023, 2, 20);

        System.out.println("calendar1 = " + calendar1.getTime());
        System.out.println("calendar2 = " + calendar2.getTime());
        System.out.println("calendar3 = " + calendar3.getTime());

        String calendarFormat1 = simpleDateFormat.format(calendar1.getTime());
        String calendarFormat2 = simpleDateFormat.format(calendar2.getTime());
        String calendarFormat3 = simpleDateFormat.format(calendar3.getTime());
        System.out.println("calendarFormat1 = " + calendarFormat1);
        System.out.println("calendarFormat2 = " + calendarFormat2);
        System.out.println("calendarFormat3 = " + calendarFormat3);
        System.out.println();

        // before(), after()
        System.out.printf("%s.before(%s) => %b\n", calendarFormat1, calendarFormat2, calendar1.before(calendar2));
        System.out.printf("%s.after(%s) => %b\n", calendarFormat1, calendarFormat2, calendar1.after(calendar2));
        System.out.printf("%s.before(%s) => %b\n", calendarFormat1, calendarFormat3, calendar1.before(calendar3));
        System.out.printf("%s.after(%s) => %b\n", calendarFormat1, calendarFormat3, calendar1.after(calendar3));
        System.out.println();
        System.out.println();

        Calendar calendar4 = Calendar.getInstance();
        Calendar calendar5 = Calendar.getInstance();
        System.out.println("calendar4 = " + calendar4.getTime());
        System.out.println("calendar5 = " + calendar5.getTime());

        // add() : 전달된 일정 시간 만큼을 더하거나 빼줌
        // 다른 Calendar 필드에는 영향 줄 수 있음
        calendar4.add(Calendar.SECOND, 60);
        System.out.println("calendar4.add() = " + calendar4.getTime());

        // roll() : 전달된 Calendar 필드에서 일정 시간 만큼을 더하거나 빼줌
        // 다른 Calendar 필드에는 영향 주지 않음
        calendar5.roll(Calendar.SECOND, 60); // 60초 => 1분
        System.out.println("calendar5.roll() = " + calendar5.getTime());
        System.out.println();
        System.out.println();

        // clear() : Thu Jan 01 00:00:00 KST 1970
        Calendar calendar6 = Calendar.getInstance();
        System.out.println("calendar6 = " + calendar6.getTime());
        calendar6.clear(Calendar.MONTH);
        System.out.println("calendar6.clear() = " + calendar6.getTime());
        calendar6.clear();
        System.out.println("calendar6.clear() = " + calendar6.getTime());
        System.out.println();
        System.out.println();


        System.out.println("============================= TimeZone Change =============================");
        printChangedTimeZones("Asia"); // 아시아 타임존 다 디폴트로 바꾸고 출력

    }

    // 파라미터로 들어온 타임존의 시간 다 디폴트로 바꾸기
    private static void printChangedTimeZones(String zone) {
        Calendar changeTimeZone = Calendar.getInstance();
        System.out.println("originalTimeZone = " + changeTimeZone.getTime());

        // TimeZone.getAvailableIDs() : 자바에서 실행 가능한 타임존 다 가지고 와서
        // setTimeZone() : 타임존 수정
        for (String tz: TimeZone.getAvailableIDs()) {
            if (tz.startsWith(zone)) {
                TimeZone.setDefault(TimeZone.getTimeZone(tz));

                System.out.println("timeZone = " + tz);
                System.out.println("changeTimeZone = " + changeTimeZone.getTime());
                System.out.println();
            }
        }
    }
}



Locale

지역 마다 지정된 [언어][나라] 등의 정보를 담고 있는 클래스
language (언어코드) - ISO 639 alpha-2 https://ko.wikipedia.org/wiki/ISO_639
country (나라코드) - ISO 3166-1 alpha-2 https://ko.wikipedia.org/wiki/ISO_3166-1_alpha-2

국가별 페이지
사용자가 설정한 locale 설정에 따라 하나의 index.jsp 로 동적인 부분만 다르게 지원 (애플) - locale interceptor
예전에는 언어 별로 다른 .jps 만듦

import java.text.DateFormat;
import java.util.Calendar;
import java.util.Locale;

public class LocaleExample {
    public static void main(String[] args) {
        printAvailableLocales(); // 모든 locale 의 [나라_언어] 출력
        System.out.println();

        // getDefault() : ko_KR
        Locale localeDefault = Locale.getDefault();
        System.out.println("localeDefault = " + localeDefault);
        System.out.println();

        // language, country 로 생성 => locale 변경
        Locale localeJP = new Locale("ja", "JP");
        System.out.println("localeJP.getDisplayLanguage() = " + localeJP.getDisplayLanguage()); // 풀네임
        System.out.println("localeJP.getLanguage() = " + localeJP.getLanguage()); // 언어 코드
        System.out.println("localeJP.getDisplayCountry() = " + localeJP.getDisplayCountry()); // 풀네임
        System.out.println("localeJP.getCountry() = " + localeJP.getCountry()); // 나라 코드
        System.out.println();

        Locale localeUS = new Locale("en", "US");
        System.out.println("localeUS.getDisplayLanguage() = " + localeUS.getDisplayLanguage());
        System.out.println("localeUS.getLanguage() = " + localeUS.getLanguage());
        System.out.println("localeUS.getDisplayCountry() = " + localeUS.getDisplayCountry());
        System.out.println("localeUS.getCountry() = " + localeUS.getCountry());
        System.out.println();

        // static field 로 생성
        Locale localUsingStaticFieldJP = Locale.JAPAN;
        System.out.println("localUsingStaticFieldJP.getDisplayLanguage() = " + localUsingStaticFieldJP.getDisplayLanguage());
        System.out.println("localUsingStaticFieldJP.getLanguage() = " + localUsingStaticFieldJP.getLanguage());
        System.out.println("localUsingStaticFieldJP.getDisplayCountry() = " + localUsingStaticFieldJP.getDisplayCountry());
        System.out.println("localUsingStaticFieldJP.getCountry() = " + localUsingStaticFieldJP.getCountry());
        System.out.println();

        Locale localUsingStaticFieldUS = Locale.US;
        System.out.println("localUsingStaticFieldUS.getDisplayLanguage() = " + localUsingStaticFieldUS.getDisplayLanguage());
        System.out.println("localUsingStaticFieldUS.getLanguage() = " + localUsingStaticFieldUS.getLanguage());
        System.out.println("localUsingStaticFieldUS.getDisplayCountry() = " + localUsingStaticFieldUS.getDisplayCountry());
        System.out.println("localUsingStaticFieldUS.getCountry() = " + localUsingStaticFieldUS.getCountry());
        System.out.println();

        getDateWithDifferentLocales(); //
        System.out.println();
    }

    //
    private static void getDateWithDifferentLocales() {
        // Calendar
        Calendar calendar = Calendar.getInstance();
        calendar.set(2020, 8, 19, 14, 22, 30);

        // Locale
        Locale localeCN = Locale.SIMPLIFIED_CHINESE;
        Locale localeUS = new Locale("en", "US");

        // Calendar + Locale
        // DateFormat.getDateInstance() : Locale 포맷에 맞게 set
        String cn = DateFormat.getDateInstance(DateFormat.FULL, localeCN).format(calendar.getTime()); // FULL, MEDIUM
        String us = DateFormat.getDateInstance(DateFormat.FULL, localeUS).format(calendar.getTime());

        System.out.println("cn = " + cn); // 2020年9月19日星期六
        System.out.println("us = " + us); // Saturday, September 19, 2020
    }

    private static void printAvailableLocales() {
        // getAvailableLocales() : 모든 locale 의 [나라_언어] 출력
        Locale[] locales = Locale.getAvailableLocales();
        for (Locale locale: locales) {
            System.out.print(locale + " ");
        }
        System.out.println();
    }
}

  • 웹 개발시 필요한 경우
// 클라이언트가 통과 한 언어 요청 정보를 수락
String language = request.getParameter("myLanguage");   

// 언어 영역 정보를 정의
Locale currentLocale = null;   

// 다른 요청에 따라 다른 언어 환경 정보를 만듦
if ("kr".equals(language)) { currentLocale = new Locale("kr", "KO"); }
else if ("en".equals(language)) { currentLocale = new Locale("en", "US"); }   //...... //session에서 정보를 변경하십시오 this.setLocale(request, currentLocale);   //물론 페이지에 리소스 파일 정보를 표시 할 때 다음 방법을 사용하십시오.:



Arrays

0개의 댓글

관련 채용 정보