Converting NSString to NSDate (and back again)

后端 未结 17 2506
-上瘾入骨i
-上瘾入骨i 2020-11-21 23:26

How would I convert an NSString like \"01/02/10\" (meaning 1st February 2010) into an NSDate? And how could I turn the NSDat

17条回答
  •  攒了一身酷
    2020-11-22 00:10

    When using fixed-format dates you need to set the date formatter locale to "en_US_POSIX".

    Taken from the Data Formatting Guide

    If you're working with fixed-format dates, you should first set the locale of the date formatter to something appropriate for your fixed format. In most cases the best locale to choose is en_US_POSIX, a locale that's specifically designed to yield US English results regardless of both user and system preferences. en_US_POSIX is also invariant in time (if the US, at some point in the future, changes the way it formats dates, en_US will change to reflect the new behavior, but en_US_POSIX will not), and between platforms (en_US_POSIX works the same on iPhone OS as it does on OS X, and as it does on other platforms).

    Swift 3 or later

    extension Formatter {
        static let customDate: DateFormatter = {
            let formatter = DateFormatter()
            formatter.locale = Locale(identifier: "en_US_POSIX")
            formatter.dateFormat = "dd/MM/yy"
            return formatter
        }()
        static let time: DateFormatter = {
            let formatter = DateFormatter()
            formatter.locale = Locale(identifier: "en_US_POSIX")
            formatter.dateFormat = "HH:mm"
            return formatter
        }()
        static let weekdayName: DateFormatter = {
            let formatter = DateFormatter()
            formatter.dateFormat = "cccc"
            return formatter
        }()
        static let month: DateFormatter = {
            let formatter = DateFormatter()
            formatter.dateFormat = "LLLL"
            return formatter
        }()
    }
    

    extension Date {
        var customDate: String {
            return Formatter.customDate.string(from: self)
        }
        var customTime: String {
            return Formatter.time.string(from: self)
        }
        var weekdayName: String {
            return Formatter.weekdayName.string(from: self)
        }
        var monthName: String {
            return Formatter.month.string(from: self)
        }
    }
    
    extension String {
        var customDate: Date? {
            return Formatter.customDate.date(from: self)
        }
    }
    

    usage:

    // this will be displayed like this regardless of the user and system preferences
    Date().customTime          //  "16:50"
    Date().customDate          //  "06/05/17"
    // this will be displayed according to user and system preferences
    Date().weekdayName         //  "Saturday"
    Date().monthName           //  "May"
    

    Parsing the custom date and converting the date back to the same string format:

    let dateString = "01/02/10"
    
    if let date = dateString.customDate {
        print(date.customDate)   // "01/02/10\n"
        print(date.monthName)    // customDate
    }
    

    Here it is all elements you can use to customize it as necessary:

    enter image description here

提交回复
热议问题