How would I convert an NSString
like \"01/02/10\" (meaning 1st February 2010) into an NSDate
? And how could I turn the NSDat
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: