Jam's story

23일차- 날짜와 시간, 형식화 본문

Java

23일차- 날짜와 시간, 형식화

애플쩀 2022. 3. 22. 16:51
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

월=M , 분=m

문자열을 날짜형식으로 
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