How would I convert an NSString
like "01/02/10" (meaning 1st February 2010) into an NSDate
? And how could I turn the NSDate
back into a string?
问题:
回答1:
Swift 4 and later
Updated: 16th November 2017
String to Date
var dateString = "02-03-2017" var dateFormatter = DateFormatter() // This is important - we set our input date format to match our input string // if the format doesn't match you'll get nil from your string, so be careful dateFormatter.dateFormat = "dd-MM-yyyy" //`date(from:)` returns an optional so make sure you unwrap when using. var dateFromString: Date? = dateFormatter.date(from: dateString)
Date to String
var formatter = DateFormatter() formatter.dateFormat = "dd-MM-yyyy" guard let unwrappedDate = dateFromString else { return } //Using the dateFromString variable from before. let stringDate: String = formatter.string(from: dateFromString)
Swift 3
Updated: 20th July 2017
String to NSDate
var dateString = "02-03-2017" var dateFormatter = DateFormatter() // This is important - we set our input date format to match our input string // if the format doesn't match you'll get nil from your string, so be careful dateFormatter.dateFormat = "dd-MM-yyyy" var dateFromString = dateFormatter.date(from: dateString)
NSDate to String
var formatter = DateFormatter() formatter.dateFormat = "dd-MM-yyyy" let stringDate: String = formatter.string(from: dateFromString)
Swift
Updated: 22nd October 2015
String to NSDate
var dateString = "01-02-2010" var dateFormatter = NSDateFormatter() // this is imporant - we set our input date format to match our input string dateFormatter.dateFormat = "dd-MM-yyyy" // voila! var dateFromString = dateFormatter.dateFromString(dateString)
NSDate to String
var formatter = NSDateFormatter() formatter.dateFormat = "dd-MM-yyyy" let stringDate: String = formatter.stringFromDate(NSDate()) println(stringDate)
Objective-C
NSString to NSDate
NSString *dateString = @"01-02-2010"; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"dd-MM-yyyy"]; NSDate *dateFromString = [dateFormatter dateFromString:dateString];
NSDate convert to NSString:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"dd-MM-yyyy"]; NSString *stringDate = [dateFormatter stringFromDate:[NSDate date]]; NSLog(@"%@", stringDate);
回答2:
Made an NSString extension for that.
// Simple as this. date = dateString.dateValue;
Thanks to NSDataDetector, it recognizes a whole lot of format.
'2014-01-16' dateValue is 14-01-16 11:00:00 +0000> '2014.01.16' dateValue is 14-01-16 11:00:00 +0000> '2014/01/16' dateValue is 14-01-16 11:00:00 +0000> '2014 Jan 16' dateValue is 14-01-16 11:00:00 +0000> '2014 Jan 16th' dateValue is 14-01-16 11:00:00 +0000> '20140116' dateValue is 14-01-16 11:00:00 +0000> '01-16-2014' dateValue is 14-01-16 11:00:00 +0000> '01.16.2014' dateValue is 14-01-16 11:00:00 +0000> '01/16/2014' dateValue is 14-01-16 11:00:00 +0000> '16 January 2014' dateValue is 14-01-16 11:00:00 +0000> '01-16-2014 17:05:05' dateValue is 14-01-16 16:05:05 +0000> '01-16-2014 T 17:05:05 UTC' dateValue is 14-01-16 17:05:05 +0000> '17:05, 1 January 2014 (UTC)' dateValue is 14-01-01 16:05:00 +0000>
Part of eppz!kit, grab the category NSString+EPPZKit.h from GitHub.
ORIGINAL ANSWER: Whether you're not sure (or don't care) about the date format contained in the string, use NSDataDetector for parsing date.
//Role players. NSString *dateString = @"Wed, 03 Jul 2013 02:16:02 -0700"; __block NSDate *detectedDate; //Detect. NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingAllTypes error:nil]; [detector enumerateMatchesInString:dateString options:kNilOptions range:NSMakeRange(0, [dateString length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { detectedDate = result.date; }];
回答3:
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:
回答4:
Why not add a category to NSString?
// NSString+Date.h @interface NSString (Date) + (NSDate*)stringDateFromString:(NSString*)string; + (NSString*)stringDateFromDate:(NSDate*)date; @end // NSString+Date.m NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; [dateFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss ZZZ"]; NSDate *date = [dateFormatter dateFromString:stringDate ]; [dateFormatter release]; + (NSDateFormatter*)stringDateFormatter { static NSDateFormatter* formatter = nil; if (formatter == nil) { formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss ZZZ"]; } return formatter; } + (NSDate*)stringDateFromString:(NSString*)string { return [[NSString stringDateFormatter] dateFromString:string]; } + (NSString*)stringDateFromDate:(NSDate*)date { return [[NSString stringDateFormatter] stringFromDate:date]; } // Usage (#import "NSString+Date.h") or add in "YOUR PROJECT".pch file NSString* string = [NSString stringDateFromDate:[NSDate date]]; NSDate* date = [NSString stringDateFromString:string];
回答5:
using "10" for representing a year is not good, because it can be 1910, 1810, etc. You probably should use 4 digits for that.
If you can change the date to something like
yyyymmdd
Then you can use:
// Convert string to date object NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"yyyyMMdd"]; NSDate *date = [dateFormat dateFromString:dateStr]; // Convert date object to desired output format [dateFormat setDateFormat:@"EEEE MMMM d, YYYY"]; dateStr = [dateFormat stringFromDate:date]; [dateFormat release];
回答6:
NSString *dateStr = @"Tue, 25 May 2010 12:53:58 +0000"; // Convert string to date object NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"EE, d LLLL yyyy HH:mm:ss Z"]; NSDate *date = [dateFormat dateFromString:dateStr]; [dateFormat release];
回答7:
// Convert string to date NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"yyyyMMdd"]; NSDate *date = [dateFormat dateFromString:dateStr]; // Convert Date to string [dateFormat setDateFormat:@"EEEE MMMM d, YYYY"]; dateStr = [dateFormat stringFromDate:date]; [dateFormat release];
回答8:
NSString *mystr=@"Your string date"; NSCalendar *cal = [NSCalendar currentCalendar]; NSDate *now = [dateFormatter dateFromString:mystr]; Nslog(@"%@",now);
If you want set the format use below code:
NSString *dateString = @"01-02-2010"; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; // this is important - we set our input date format to match our input string // if format doesn't match you'll get nil from your string, so be careful [dateFormatter setDateFormat:@"dd-MM-yyyy"]; NSDate *dateFromString = [[NSDate alloc] init]; // voila! dateFromString = [dateFormatter dateFromString:dateString]; Nslog(@"%@",[dateFormatter dateFromString:dateString]);
回答9:
Use this method to convert from NSString
to NSdate
:
-(NSDate *)getDateFromString:(NSString *)pstrDate { NSDateFormatter* myFormatter = [[NSDateFormatter alloc] init]; [myFormatter setDateFormat:@"dd/MM/yyyy"]; NSDate* myDate = [myFormatter dateFromString:pstrDate]; return myDate; }
回答10:
If anyone is interested in doing something like this in Swift these days, I have a start on something, although it's not perfect.
func detectDate(dateString: NSString) -> NSDate { var error: NSError? let detector: NSDataDetector = NSDataDetector.dataDetectorWithTypes(NSTextCheckingType.Date.toRaw(), error: &error)! if error == nil { var matches = detector.matchesInString(dateString, options: nil, range: NSMakeRange(0, dateString.length)) let currentLocale = NSLocale.currentLocale() for match in matches { match.resultType == NSTextCheckingType.Date NSLog("Date: \(match.date.description)") return match.date } } return NSDate() }
回答11:
Date to NSString
NSString *dateString = [NSString stringWithFormat:@"%@",[NSDate date]]; NSLog(@"string: %@",dateString ); //2015-03-24 12:28:49 +0000
NSString to NSDate
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"]; NSDate *date = [formatter dateFromString:dateString]; NSLog(@"date: %@", date); //015-03-24 12:28:49 +0000
回答12:
You can use extensions for this.
extension NSDate { //NSString to NSDate convenience init(dateString:String) { let nsDateFormatter = NSDateFormatter() nsDateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss" // Add the locale if required here let dateObj = nsDateFormatter.dateFromString(dateString) self.init(timeInterval:0, sinceDate:dateObj!) } //NSDate to time string func getTime() -> String { let timeFormatter = NSDateFormatter() timeFormatter.dateFormat = "hh:mm" //Can also set the default styles for date or time using .timeStyle or .dateStyle return timeFormatter.stringFromDate(self) } //NSDate to date string func getDate() -> String { let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "dd, MMM" return dateFormatter.stringFromDate(self) } //NSDate to String func getString() -> String { let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss" return dateFormatter.stringFromDate(self) } }
So while execution actual code will look like follows
var dateObjFromString = NSDate(dateString: cutDateTime) var dateString = dateObjFromString.getDate() var timeString = dateObjFromString.getTime() var stringFromDate = dateObjFromString.getString()
There are some defaults methods as well but I guess it might not work for the format you have given from documentation
-dateFromString(_:) -stringFromDate(_:) -localizedStringFromDate(_ date: NSDate, dateStyle dateStyle: NSDateFormatterStyle, timeStyle timeStyle: NSDateFormatterStyle) -> String
回答13:
Best practice is to build yourself a general class where you put all your general use methods, methods useful in almost all projects and there add the code suggested by @Pavan as:
+ (NSDate *)getDateOutOfString:(NSString *)passedString andDateFormat:(NSString *)dateFormat{ NSString *dateString = passedString; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:dateFormat]; NSDate *dateFromString = [[NSDate alloc] init]; dateFromString = [dateFormatter dateFromString:dateString]; return dateFromString; }
.. and so on for all other useful methods
By doing so you start building a clean reusable code for you app. Cheers!
回答14:
As per Swift 2.2
You can get easily NSDate from String and String from NSDate. e.g.
First set date formatter
let formatter = NSDateFormatter(); formatter.dateStyle = NSDateFormatterStyle.MediumStyle formatter.timeStyle = .NoStyle formatter.dateFormat = "MM/dd/yyyy"
Now get date from string and vice versa.
let strDate = formatter.stringFromDate(NSDate()) print(strDate) let dateFromStr = formatter.dateFromString(strDate) print(dateFromStr)
Now enjoy.
回答15:
NSString to NSDate or NSDate to NSString
//This method is used to get NSDate from string //Pass the date formate ex-"dd-MM-yyyy hh:mm a" + (NSDate*)getDateFromString:(NSString *)dateString withFormate:(NSString *)formate { // Converted date from date string NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]]; [dateFormatter setDateFormat:formate]; NSDate *convertedDate = [dateFormatter dateFromString:dateString]; return convertedDate; } //This method is used to get the NSString for NSDate //Pass the date formate ex-"dd-MM-yyyy hh:mm a" + (NSString *)getDateStringFromDate:(NSDate *)date withFormate:(NSString *)formate { // Converted date from date string NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; //[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]]; [dateFormatter setDateFormat:formate]; NSString *convertedDate = [dateFormatter stringFromDate:date]; return convertedDate; }
回答16:
The above examples aren't simply written for Swift 3.0+
Update - Swift 3.0+ - Convert Date To String
let date = Date() // insert your date data here var dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd" // add custom format if you'd like var dateString = dateFormatter.string(from: date)