[Swift] String <-> NSDate

swift date string

NSDate를 쉽게 다루기

예)

let date = "2016-09-02 12:00:00".toDate("yyyy-MM-dd HH:mm:ss")
date.toLocalTimeString() // -> "2016-09-02 12:00:00.000"
date.toString(.FullStyle, timeStyle: .FullStyle) // -> "2016년 9월 2일 금요일 오후 12시 0분 0초 대한민국 표준시"
date.toRelativeString() // -> "6 hours ago"


소스:
extension String {
    func localized(comment: String = "", tableName: String? = nil) -> String {
        if let value = NSLocalizedString(self, tableName: tableName, bundle: NSBundle.mainBundle(), value: "", comment: comment) as String? {
            return value
        }
        
        return self
    }

    func toDate(format: String = "EEE, dd MMM yyyy HH:mm:ss ZZZ") -> NSDate! {
        let formatter = NSDateFormatter()
        formatter.dateFormat = format
        guard let date = formatter.dateFromString(self) else {
            return nil
        }
        return date
    }
}

extension NSDate {
    func toLocalTimeString(format: String = "yyyy-MM-dd HH:mm:ss.SSS") -> String {
        let formatter = NSDateFormatter()
        formatter.timeZone = NSTimeZone.localTimeZone()
        formatter.dateFormat = format
        return formatter.stringFromDate(self)
    }
    
    func toString(dateStyle: NSDateFormatterStyle, timeStyle: NSDateFormatterStyle) -> String {
        let formatter = NSDateFormatter()
        formatter.timeZone = NSTimeZone.localTimeZone()
        formatter.dateStyle = dateStyle
        formatter.timeStyle = timeStyle
        return formatter.stringFromDate(self)
    }
    
    func toRelativeString(format: String = "yyyy-MM-dd HH:mm:ss") -> String {
        let s = Int(-self.timeIntervalSinceNow)
        switch (s) {
        case 0...20:
            return "Now".localized()
            
        case 21...59:
            return "1 minute ago".localized()
            
        case 60...3599:
            return NSString(format: "%d minutes ago".localized(), s / 60) as String
            
        case 3600...7199:
            return "1 hour ago".localized()
            
        case 7200...86399:
            return NSString(format: "%d hours ago".localized(), s / 3600) as String

        default:
            let formatter = NSDateFormatter()
            formatter.timeZone = NSTimeZone.localTimeZone()
            formatter.dateFormat = format
            return formatter.stringFromDate(self)
        }
    }
}

유승훈 7년전 질문


댓글 0

댓글작성

목록보기