StringTokenizer / Scanner / Arrays / Random / Date / Calendar / Locale
특정 시간 저장하는 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 클래스
특정 날짜를 설정하거나 날짜 산술 수행해야하는 경우 사용
지역 설정 가능
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();
}
}
}
}
지역 마다 지정된 [언어][나라] 등의 정보를 담고 있는 클래스
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); //물론 페이지에 리소스 파일 정보를 표시 할 때 다음 방법을 사용하십시오.: