관리 메뉴

이리메라 갖다가

[Swift] 호텔 객실 예약 프로그래밍(2) : date, 날짜 다루기 본문

TIL

[Swift] 호텔 객실 예약 프로그래밍(2) : date, 날짜 다루기

너이르나 2023. 7. 21. 21:39
728x90
반응형
1. date 형식

객실 예약을 받을 때 체크인/체크아웃을 String으로 입력하지만, 해당 값을 date형으로 바꾸기 위해 date 형식에 대해 알아봤다.

// 1. 현재 시간
Date()

// 2. 현재 시간을 기준으로 n(TimeInterval)초가 지난 시점의 시간
Date(timeIntervalSinceNow: TimeInterval)

// 3. 다른 시간으로부터 n(TimeInterval)초 지난 시점의 시간
Date(timeInterval: TimeInterval, since: Date)

 

 

2. date 형 변환

String <-> Date 형 변환을 위해 DateFommatter을 사용한다.

// 1. Date to String
let now() = Date()
let formatter = DateFormatter()
fotmatter.dateFormat = "yyyy-MM-dd"
let result = formatter.srting(from: now)
print(result) // 2023-07-21


// 2. String to Date
let dateString = "2023-07-21"
formatter.dateFormat = "yyyy-MM-dd"
let date = formatter.date(from: dataString)!
print(date) // 2023-07-21

 

나는 date를 입력받을거라 readLine()을 사용해 날짜를 받아 date형식으로 변환했다.

let dataFormatter = DateFormatter()
    dataFormatter.dateFormat = "yyyy-MM-dd"

...

repeat {
    
    ...
    
    if input == 3 {
        print("---------------------------")
        print("<객실 예약 하기>") 
        
        print("체크인 날짜를 입력해주세요.(ex. YYYY-MM-DD)")
        var inputCheckInDate = readLine()
        
        while inputCheckInDate == nil || (dataFormatter.date(from: inputCheckInDate!) == nil) {
            print("잘못 입력하였습니다. 올바른 날짜를 입력해주세요.(ex. YYYY-MM-DD)")
            inputCheckInDate = readLine()
        }
    }
    
    ...
    
} while true

 

3. date 검증

체크아웃 날짜를 입력받을 때 체크인보다 빠르거나 같은 날짜를 입력하지 못하도록 조건문과 반복문을 사용했다.

if let date1: Date = dataFormatter.date(from: inputCheckInDate!),
   let date2: Date = dataFormatter.date(from: inputCheckOutDate!) {

        var newDate2: Date = date2	

        while date1 >= newDate2 {
        	print("체크인 날짜보다 이전 날짜를 선택할 수 없습니다. 날짜를 확인해주세요.")
        	inputCheckOutDate = readLine()
	
        	if let finalCheckOutDate = dataFormatter.date(from: inputCheckOutDate!) {
        		newDate2 = finalCheckOutDate
        	}
        }
	}

 

4. date 비교 compare

 

처음에는 date를 비교할 수 있는 .compare()을 사용하려고 했는데 switch case 문의 경우 날짜를 다시 입력받을 수 있는 반복문을 구현하기가 어려웠다.

repeat {
    switch date1.compare(date2) {
        case .orderedSame:
            print("체크인 날짜와 같습니다. 날짜를 확인해주세요.")
            inputCheckOutDate = readLine()
            let newDate2: Date = dataFormatter.date(from: inputCheckOutDate!) {
                date2 = newDate2
            }
        case .orderedDescending:
            print("체크인 날짜보다 이전 날짜를 선택할 수 없습니다. 날짜를 확인해주세요.")
            inputCheckOutDate = readLine()
        case .orderedAscending:
            continue
        }
    break
} while true
  • date1.compare(date2) : date1을 기준으로 date2와 비교
  • .orderedSame : date1과 date2가 같을 때
  • .orderedDescending : date2가 date1보다 앞선 날짜일 때
  • .orderedAscending : date1가 date2보다 앞선 날짜일 때 

 

코드 짜고 실행할 땐 몰랐는데, 지금보니까 .orderedDescending에서 date2로 할당해줬으면 계산이 됐을 것 같다.

이부분은 내일 다시 수정해보는걸로..

 

 

728x90
반응형