2017-10-15 9 views
1

"그냥 지금, 2 분, 1 시간, 1 일, 10 분의 10"과 같은 텍스트 형식으로 날짜를 변환하는 함수를 만들려고합니다. 저는 여기에서 오류가 점점 오전 내 샘플 코드입니다 : 여기"MM-dd-yyyy hh : mm : ss a"날짜를 텍스트 형식으로 변환하는 방법?

let components = cal.components([.Day,.Hour,.Minute], fromDate: date, toDate: NSDate(), options:[]) 

은 내 전체 코드 : 내 코드에서

변경 :이 같은

func getTextToDisplayFormattingDate(date: NSDate) -> String { 
    var textToDisplay = "" 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "MM-dd-yyyy hh:mm:ss a" 
    dateFormatter.timeZone = TimeZone(identifier: "UTC") 

    let cal = NSCalendar.current 

    let components = cal.components([.Day,.Hour,.Minute], fromDate: date, toDate: NSDate(), options:[]) 

    switch components.day { 
    case 0: 
     if components.hour == 0 { 
      if components.minute <= 0 { 
       textToDisplay = "just now " 
      } else { 
       textToDisplay = "\(components.minute) min" 
      } 
     } else { 
      textToDisplay = "\(components.hours) hrs" 
     } 
    case 1...6: 
     textToDisplay = "\(components.day) d" 
    default: 
     dateFormatter.dateFormat = "MMM dd" 
     textToDisplay = dateFormatter.string(from: date as Date) 
    } 

    return textToDisplay 
} 

error

+0

Swift 3 코드에서 Swift 2 구문을 모두 제거하십시오. – rmaddy

답변

0

사실,이 일, 시간, 분 NSCalendar.components에 의해 2 사이의 날짜를 계산하기 어렵다 프로 시저 예기치 않은 결과가 발생할 수 있습니다. 일반적으로 우리는 그들 사이에 TimeInterval으로 계산합니다.

func getTextToDisplayFormattingDate(date: Date) -> String { 
    var textToDisplay = "" 

    let now = Date() 
    let timeInterval = now.timeIntervalSince(date) 
    if timeInterval < 60 { 
     textToDisplay = "just now " 
    } 
    else if timeInterval < 60 * 60 { 
     textToDisplay = "\(Int(timeInterval/60)) min" 
    } 
    else if timeInterval < 60 * 60 * 24 { 
     textToDisplay = "\(Int(timeInterval/60/60)) hrs" 
    } 
    else { 
     let dateFormatter = DateFormatter() 
     dateFormatter.timeZone = TimeZone(identifier: "UTC") 

     if timeInterval < 60 * 60 * 24 * 6 { //less than 6 days 
      // For getting days 
      // textToDisplay = "\(Int(timeInterval/60/60/24)) d" 

      // For getting weekday name 
      dateFormatter.dateFormat = "EEEE" 
      textToDisplay = dateFormatter.string(from: date) //weekday name 
     } 
     else{ 
      dateFormatter.dateFormat = "MMM dd" 
      textToDisplay = dateFormatter.string(from: date as Date) 
     } 
    } 

    return textToDisplay 
} 

을 그리고 성능을 향상시키기 위해 60 * 60 * 24 같은 표현을 대체하기 위해 사용하는 상수를 기억 : SWIFT 3.2 SWIFT 4.0이보십시오.

+0

6 일 이내에 주중 이름을 표시하려면 어떻게해야합니까? 예 : 방금, 지금, 시간, 목요일, 수요일, 화요일, 10 월 10 일, oct'9 @yun chen –

+0

@WhenKey, 6 일 미만인 경우 요일 이름을 얻는 답이 업데이트되었습니다. 시도 해봐. –

2

사용 :

  1. NSDate 대신 Date을 사용했습니다. optionalNSCalendar 대신에
  2. 내가
  3. components(_:from:to:options:)Calendarday, minute, hour 같은 dateComponents(_:from:to:)
  4. components 값으로 이름이 변경되었습니다 사용됩니다. 그게 내가 스위치를 확인하기 전에 왜 추가했는지.

    func getTextToDisplayFormattingDate(date: Date) -> String { 
        var textToDisplay = "" 
        let dateFormatter = DateFormatter() 
        dateFormatter.dateFormat = "MM-dd-yyyy hh:mm:ss a" 
        dateFormatter.timeZone = TimeZone(identifier: "UTC") 
    
        let cal = Calendar.current 
        let components = cal.dateComponents([.day, .hour , .minute], from: date, to: Date()) 
    
        if let day = components.day, let minute = components.minute, let hour = components.hour { 
         switch day { 
         case 0: 
          if hour == 0 { 
           if minute <= 0 { 
            textToDisplay = "just now " 
           } else { 
            textToDisplay = "\(minute) min" 
           } 
          } else { 
           textToDisplay = "\(hour) hrs" 
          } 
         case 1...6: 
          textToDisplay = "\(day) d" 
         default: 
          dateFormatter.dateFormat = "MMM dd" 
          textToDisplay = dateFormatter.string(from: date) 
         } 
        } 
        return textToDisplay 
    } 
    
+0

'date as date '를 캐스팅 할 필요가 없습니다. 이미'Date'입니다. – rmaddy

+0

질문의 성격을 감안할 때 필요한 수정 사항과 이유를 모두 설명하는 대답을 설명에 추가하면 도움이 될 것입니다. – rmaddy

+0

@ViniApp 대단히 감사합니다 !! 그것은 정말로 굉장하다. thanks –