Jam's story
23일차- 날짜와 시간, 형식화 본문
Calendar add() roll() 메소드
public class Prac {
public static void main(String[] args) {
Calendar date=Calendar.getInstance();
date.set(2015,7,31);
System.out.println(toString(date));
date.add(Calendar.DATE, 1);
System.out.println(toString(date));
date.add(Calendar.MONTH, -6);
System.out.println(toString(date));
date.roll(Calendar.DATE, 31);
System.out.println(toString(date));
date.add(Calendar.DATE, 31);
System.out.println(toString(date));
}
private static String toString(Calendar cal) {
// TODO Auto-generated method stub
return cal.get(Calendar.YEAR)+"년"+(cal.get(Calendar.MONTH)+1)+"월"+cal.get(Calendar.DATE)+"일";
}
}
roll() 메소드는 월 필드값은 변경되지 않고 일수만 달라진다.
예외도 있다.
일 필드가 말일 일때, 월필드를 바꾸면 해당 월에 맞게 달라진다.
Calendar date=Calendar.getInstance();
date.set(2015,0,31);
date.roll(Calendar.MONTH, 1);
System.out.println(toString(date));
date.set(2015,0,31);
date.add(Calendar.MONTH, 1);
System.out.println(toString(date));
2월의 마지막날은 28일이기때문에 한달을 더했더니 일수도 달라졌다.
달력출력
package days23;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
/**
* @author 지민
* @date 2022. 3. 22. - 오후 5:19:38
* @subject
* @content
*
*/
public class Prac {
public static void main(String[] args) {
int year=2015;
int month=11;
int START_DAY_OF_WEEK=0;
int END_DAY=0;
Calendar sDay=Calendar.getInstance();
Calendar eDay=Calendar.getInstance();
sDay.set(year, month-1, 1);
eDay.set(year,month,1);
eDay.add(Calendar.DATE, -1);
START_DAY_OF_WEEK=sDay.get(Calendar.DAY_OF_WEEK);
END_DAY=eDay.get(Calendar.DATE);
System.out.println(year+"년"+month+"월");
System.out.println(" 일 월 화 수 목 금 토 ");
for (int i = 1; i < START_DAY_OF_WEEK; i++) {
System.out.print(" ");
}
for (int i = 1,n=START_DAY_OF_WEEK; i <=END_DAY; i++ ,n++) {
System.out.print((i<10)? " "+i:" "+i);
if(n%7==0) System.out.println();
}
}
}
달력- 강사님 코드
public class Ex07 {
public static void main(String[] args) {
// [Calendar 클래스 사용 ]
int year = 2022;
int month = 3;
// 1. 2010.5.1 무슨 요일 ? 1(일) ~ 7(토)
int START_DAY_OF_WEEK = 0;
Calendar sDay = new GregorianCalendar(year, month-1, 1);
START_DAY_OF_WEEK = sDay.get(Calendar.DAY_OF_WEEK);
// 2. 2010.5. ?? 마지막날짜?
int END_DAY = 0;
Calendar eDay = new GregorianCalendar(year, month, 1); // 2010.6.1
eDay.add(Calendar.DATE, -1);
END_DAY = eDay.get(Calendar.DATE);
// 달력 출력
System.out.printf("\t%d년 %d월\n", year, month);
System.out.printf("일\t월\t화\t수\t목\t금\t토\n");
for (int i = 1; i < START_DAY_OF_WEEK; i++) {
System.out.print("\t");
}
for (int i = 1; i <= END_DAY; i++) {
System.out.printf("%d\t", i);
// 개행
if( ( i + START_DAY_OF_WEEK -1) % 7 ==0) System.out.println();
}
} // main
} // class
Date setDate getDate getDay getMonty 달력만들기
package days23;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
/**
* @author 지민
* @date 2022. 3. 22. - 오전 9:04:21
* @subject
* @content
*days22 Ex07_02
*/
public class Ex01 {
public static void main(String[] args) {
// [Calendar 클래스 사용 ]
int year = 2010;
int month = 5;
// 1. 2010.5.1 무슨 요일 ? 1(일) ~ 7(토)
int START_DAY_OF_WEEK = 0;
Date sDay=new Date(year-1900, month-1,1);
START_DAY_OF_WEEK = sDay.getDay();
sDay.setDate(sDay.getDate()-START_DAY_OF_WEEK);
// 달력 출력
System.out.printf("\t%d년 %d월\n", year, month);
System.out.printf("\t일\t월\t화\t수\t목\t금\t토\n");
for (int i = 1; i <=42; i++) {
int date = sDay.getDate();
System.out.printf( month == sDay.getMonth() +1 ? "\t(%d)" : "\t%d", date);
sDay.setDate(sDay.getDate()+1);
if( i % 7 ==0 ) System.out.println();
}
}
}
Calendar 이용
public class Ex07_02 {
public static void main(String[] args) {
// [Calendar 클래스 사용 ]
int year = 2022;
int month = 3;
// 1. 2010.5.1 무슨 요일 ? 1(일) ~ 7(토)
int START_DAY_OF_WEEK = 0;
Calendar sDay = new GregorianCalendar(year, month-1, 1);
START_DAY_OF_WEEK = sDay.get(Calendar.DAY_OF_WEEK);
sDay.add(Calendar.DATE, -START_DAY_OF_WEEK + 1); // 2022.2.27
// 달력 출력
System.out.printf("\t%d년 %d월\n", year, month);
System.out.printf("\t일\t월\t화\t수\t목\t금\t토\n");
for (int i = 1; i <=42; i++) {
int date = sDay.get(Calendar.DATE);
System.out.printf( month == sDay.get(Calendar.MONTH) +1 ? "\t(%d)" : "\t%d", date);
sDay.add(Calendar.DATE, 1); // 다음 날짜
if( i % 7 ==0 ) System.out.println();
}
} // main
} // class
Decimal format
숫자를 형식화 하는 클래스
숫자(정수, 실수 금액)을 형식화하는 클래스
1. \u00A4 - \ 기호
2. # 10진수 기호
3. , 콤마 기호
public class Ex02 {
public static void main(String[] args) {
//1번재방법
int money=3275600;
String.format("\\%,d", money);
//2번째방법
String pattern="\u00A4#,###";
DecimalFormat df=new DecimalFormat(pattern);
String smoney=df.format(money);
System.out.println(smoney);
}
}
4자리 숫자 형식으로 출력 예) 0010
int no=10;
String sno= String.format("%04d",no);
System.out.println(sno);
//2. no자리를 계산해서 로직으로 앞에 0문자를 붙이는 방법-while, 10으로 나눠서 풀기
//3.
String pattern="0000";
DecimalFormat df=new DecimalFormat(pattern);
System.out.println(df.format(no));
0과 #의 차이
0은 숫자가 없어도 빈자리가 0으로 출력되지만 #은 숫자가 있을 때만 숫자 출력
만약
String pattern="0000.##"; 이라면 소수점이 있을때만 출력
String pattern="0000.00"; 은 소수점이 없어도 .00으로 출력
escape문자,-> 문자를 출력하고 싶을 때는 ' '
String pattern="'#'0000";
parse - 기호와 문자가 포함된 문자열을 숫자로 쉽게 바꾸기
Number- 래퍼클래스의 부모클래스
Number 클래스->int intValue()
String smoney="1,234,400";
//1
int money=Integer.parseInt(smoney.replaceAll(",", ""));
System.out.println(money);
//2
String pattern="";
DecimalFormat df=new DecimalFormat(pattern);
//문자열=df.format(smoney);
try {
Number num=df.parse(smoney);
int iMoney=num.intValue(); // number->int intValue()
}catch (Exception e) {
e.printStackTrace();
}
Date 와 Calendar 의 toString
SimpleDateFormat
문자열을 날짜형식으로
public class Prac {
public static void main(String[] args) {
SimpleDateFormat sdf1= new SimpleDateFormat("yyyy년 MM월 dd일");
SimpleDateFormat sdf2=new SimpleDateFormat("yyyy/MM/dd");
try {
Date d=sdf1.parse("2015년 11월 23일");
System.out.println(sdf2.format(d));
}catch (Exception e) {
e.printStackTrace();
}
}
}
SimpleDateFormat은 날짜를 사용자가 지정한 패턴에 맞게 출력한다.
parse는 문자열을 Date로 바꿀 수 있다 .
Date인스턴스만 foramt 메서드를 사용할 수 있다.
Calendar- > Date
Calendar c=Calendar.getInstance();
//1
Date d=new Date(c.getTimeInMillis());
//2
Date d=c.getTime();
*/
public class Prac {
public static void main(String[] args) {
String pattern= "yyyy/MM/dd";
DateFormat df=new SimpleDateFormat(pattern);
Scanner s =new Scanner(System.in);
Date inDate=null;
System.out.println("날짜를 "+ pattern +"형식으로 입력해주세요 ");
while(s.hasNextLine()) {
try {
inDate=df.parse(s.nextLine());
break;
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
System.out.println("날짜를"+pattern+"형태로 다시입력");
}
}
Calendar cal=Calendar.getInstance();
cal.setTime(inDate);
Calendar today=Calendar.getInstance();
long day=(cal.getTimeInMillis()-today.getTimeInMillis())/1000;
System.out.println(day+"만의 차이가 잇다.");
}
}
Scanner 의 hasnextLine()
Scanner s=new Scanner(System.in);
while(s.hasnestLine()){
String s1=s.nextLine();
}
반환타입은 boolean 이며,
다음라인이 내용이 있으면 true 반환 한다.
ChoiceFormat
특정범위에 속하는 값을 문자열로 변환
ChoiceFormat cf=new ChoiceFormat(값의 범위, 변환할 문자열);
cf.format(바꿀 값);
public class Ex04 {
public static void main(String[] args) {
int[] scores= {100,95,88,73,52,60,70,0};
String[] grades= {"가","양","미","우","수"};
double[] limits= {0,60,70,80,90};
ChoiceFormat cf=new ChoiceFormat(limits,grades);
for (int i = 0; i < scores.length; i++) {
System.out.printf("%d- %s \n", scores[i], cf.format(scores[i]));
}
}
}
하나로 코딩
String pattern="60#D|70#C|80#B|90#A";
ChoiceFormat cf=new ChoiceFormat(pattern);
#은 경계값을 포함 시키지만 <는 경계값을 포함시키지 않는다.
String pattern="61#D|71#C|81#B|91#A"; == String pattern="60<D|70<C|80<B|90<A";
MessageFormat
정해진 양식에 맞게 데이터 출력
package days23;
import java.text.MessageFormat;
import java.text.ParseException;
import java.util.Scanner;
/**
* @author 지민
* @date 2022. 3. 22. - 오후 5:19:38
* @subject
* @content
*
*/
public class Prac {
public static void main(String[] args) throws ParseException {
String tableName="cust_info";
String fileName="data4.txt";
String msg="insert_into"+tableName+"values{0} ,{1},{2},{3}";
Scanner s=new Scanner(System.in);
String pattern="{0},{1},{2},{3}";
MessageFormat mf=new MessageFormat(pattern);
while(s.hasNextLine()) {
String line=s.nextLine();
Object[] objs=mf.parse(line);
System.out.println(MessageFormat.format(msg, objs));
}
s.close();
}
}
java.time
Temporal , TemporlaAccessor, TemporalAdjuster 를 구현한 클래스
- LocalDate, LocalTime, LocalDateTime, ZonedDateTime, instant 등
TemporalAmount를 구현한 클래스
-Period, Duration
LocalDate 날짜 클래스
LocalTime 시간 클래스
LocalDateTime 날짜+시간 클래스
ZonedDateTime 날짜+시간+시간대
Period ->날짜- 날짜 (기간)
Duration -> 시간-시간 (지속시간)
객체생성방법
now()
of()
temporal = 시간 -시 분 초
chrono= 시간 -년 월 일 시 분 초
TemporalUnit -날짜와 시간의 단위를 정의한 인터페이스
TemporalField- 날짜와 시간의 필드를 정의한 인터페이스
열거형 - 서로 관련된 상수를 묶어서 정의해 놓은것
날짜 시간 비교
-isAfter()
-isBefore()
-isEqual()
날짜시간 값얻어올때 get() , getXXX()
수정 with() plus() minus()
Date->instant
instant->Date
LocalDateTime ->LocalDate
LocalTime ->LocalTime
TemporalAdjusters클래스
plus() minus() 메서드로 날짜 시간을 계산할 수 있다.
다음주 목요일
지난 금요일 편리한 기능이 구현된 클래스 -temporalAdjusters
between() 메소드
until()
of()
with() - 수정하는 메소드
날짜와 시간을 원하는 형식으로 출력, 파싱
LocalDate
LocalTime
현재 시간,날짜를 가져올 때는 now
지정된 시간,날짜를 가져올 때는 of
ofYearDay= 몇번째 날
ofYearDay(1999,365) 1999년의 마지막날
ofSecondDay 하루가 지난 시간
parse로 문자열을 날짜, 시간으로 바꿀 수 있다.
LocalDate ld=LocalDate.parse("2015-2-23");
LocalTime lt=LocalTime.parse("23:32:22");
get필드로 특정 필드의 값을 가져올 수 있다.
-월요일이 1
truncatedTo
절삭(제거)하다
지정한 것보다 작은 단위의 필드를 0으로 만든다 .
public class Prac {
public static void main(String[] args) throws ParseException {
LocalTime time=LocalTime.of(12, 34,56);
time=time.truncatedTo(ChronoUnit.HOURS);
System.out.println(time);
}
}
ChronoUnit.HOURS 로 지정했기 때문에 시보다 작은 단위는 0
12:00 으로 출력됨
LocalDateTime dt1=LocalDateTime.now();
System.out.println(dt1);
//시간이 달라서 false 나옴
LocalDateTime dt2=LocalDateTime.of(2022, 3, 22,0,0,0);
System.out.println(dt1.isEqual(dt2));
System.out.println(dt1.compareTo(dt2));
instant
java.util.Date 크래스 대체하기 위해 만든 클래스
Date->instant 클래스 변환 메소드 추가
from() 메소드는 instant ->Date 변환 메소드
toInstant() Date->Instant 클래스
LocalDateTime
날짜+시간
LocalDate 에 .atTime(t) .atTime(12,34,45); 로 시간정해주기
LocalTime 에 .atDate(d) .atDate(LocalDate.of(1999,2,3))ㅇ로 날짜 지정해주기
LocalDate d=LocalDate.now();
LocalTime t=LocalTime.now();
//1
LocalDateTime dt=LocalDateTime.of(d, t);
//2
LocalDateTime dt1=d.atTime(t);
//3
LocalDateTime dt3=t.atDate(d);
LocalDateTime --> LocalTime, LocalDate로 분해
LocalDate a=dt.toLocalDate();
LocalTime b=dt.toLocalTime();
TemporalAdjuster[s]
뒤에 s가 있으면 클래스 없으면 인터페이스
다음주 금요일 휴강입니다 - >몇일 ?
다가오는 3째주 금요일 -> 몇일 ?
자주 사용되는 날짜 계산 메소드를 구현해놓은 클래스
'Java' 카테고리의 다른 글
25일차 (0) | 2022.03.24 |
---|---|
24일차- 제네릭 프레임워크 (0) | 2022.03.23 |
22일차 (0) | 2022.03.21 |
정규표현식 -java.util.regex 패키지 (0) | 2022.03.20 |
Random 클래스 (0) | 2022.03.19 |
Comments