Converting NSString to NSDate (and back again)
如何将
斯威夫特4及以后
更新:2018年
字符串到日期
1 2 3 4 5 6 7 8 9 | 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) |
字符串的日期
1 2 3 4 5 6 | 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) |
斯威夫特3
更新时间:2017年7月20日
字符串到NSDate
1 2 3 4 5 6 | 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到String
1 2 3 | var formatter = DateFormatter() formatter.dateFormat ="dd-MM-yyyy" let stringDate: String = formatter.string(from: dateFromString) |
迅速
更新时间:2015年10月22日
字符串到NSDate
1 2 3 4 5 6 | 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到String
1 2 3 4 | var formatter = NSDateFormatter() formatter.dateFormat ="dd-MM-yyyy" let stringDate: String = formatter.stringFromDate(NSDate()) println(stringDate) |
Objective-C的
NSString到NSDate
1 2 3 4 | NSString *dateString = @"01-02-2010"; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"dd-MM-yyyy"]; NSDate *dateFromString = [dateFormatter dateFromString:dateString]; |
NSDate转换为NSString:
1 2 3 4 | NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"dd-MM-yyyy"]; NSString *stringDate = [dateFormatter stringFromDate:[NSDate date]]; NSLog(@"%@", stringDate); |
更新2019年(斯威夫特4):
为此做了
1 2 | // Just throw at it without any format. var date: Date? = Date.FromString("02-14-2019 17:05:05") |
非常愉快,它甚至可以识别"明天在5"这样的事情。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | XCTAssertEqual(Date.FromString("2019-02-14"), Date.FromCalendar(2019, 2, 14)) XCTAssertEqual(Date.FromString("2019.02.14"), Date.FromCalendar(2019, 2, 14)) XCTAssertEqual(Date.FromString("2019/02/14"), Date.FromCalendar(2019, 2, 14)) XCTAssertEqual(Date.FromString("2019 Feb 14"), Date.FromCalendar(2019, 2, 14)) XCTAssertEqual(Date.FromString("2019 Feb 14th"), Date.FromCalendar(2019, 2, 14)) XCTAssertEqual(Date.FromString("20190214"), Date.FromCalendar(2019, 2, 14)) XCTAssertEqual(Date.FromString("02-14-2019"), Date.FromCalendar(2019, 2, 14)) XCTAssertEqual(Date.FromString("02.14.2019 5:00 PM"), Date.FromCalendar(2019, 2, 14, 17)) XCTAssertEqual(Date.FromString("02/14/2019 17:00"), Date.FromCalendar(2019, 2, 14, 17)) XCTAssertEqual(Date.FromString("14 February 2019 at 5 hour"), Date.FromCalendar(2019, 2, 14, 17)) XCTAssertEqual(Date.FromString("02-14-2019 17:05:05"), Date.FromCalendar(2019, 2, 14, 17, 05, 05)) XCTAssertEqual(Date.FromString("17:05, 14 February 2019 (UTC)"), Date.FromCalendar(2019, 2, 14, 17, 05)) XCTAssertEqual(Date.FromString("02-14-2019 17:05:05 GMT"), Date.FromCalendar(2019, 2, 14, 17, 05, 05)) XCTAssertEqual(Date.FromString("02-13-2019 Tomorrow"), Date.FromCalendar(2019, 2, 14)) XCTAssertEqual(Date.FromString("2019 Feb 14th Tomorrow at 5"), Date.FromCalendar(2019, 2, 14, 17)) |
如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | extension Date { public static func FromString(_ dateString: String) -> Date? { // Date detector. let detector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.date.rawValue) // Enumerate matches. var matchedDate: Date? var matchedTimeZone: TimeZone? detector.enumerateMatches( in: dateString, options: [], range: NSRange(location: 0, length: dateString.utf16.count), using: { (eachResult, _, _) in // Lookup matches. matchedDate = eachResult?.date matchedTimeZone = eachResult?.timeZone // Convert to GMT (!) if no timezone detected. if matchedTimeZone == nil, let detectedDate = matchedDate { matchedDate = Calendar.current.date(byAdding: .second, value: TimeZone.current.secondsFromGMT(), to: detectedDate)! } }) // Result. return matchedDate } } |
更新2014年:
为此做了一个NSString扩展。
1 2 | // Simple as this. date = dateString.dateValue; |
感谢NSDataDetector,它识别了很多格式。
1 2 3 4 5 6 7 8 9 10 11 12 13 | '2014-01-16' dateValue is <2014-01-16 11:00:00 +0000> '2014.01.16' dateValue is <2014-01-16 11:00:00 +0000> '2014/01/16' dateValue is <2014-01-16 11:00:00 +0000> '2014 Jan 16' dateValue is <2014-01-16 11:00:00 +0000> '2014 Jan 16th' dateValue is <2014-01-16 11:00:00 +0000> '20140116' dateValue is <2014-01-16 11:00:00 +0000> '01-16-2014' dateValue is <2014-01-16 11:00:00 +0000> '01.16.2014' dateValue is <2014-01-16 11:00:00 +0000> '01/16/2014' dateValue is <2014-01-16 11:00:00 +0000> '16 January 2014' dateValue is <2014-01-16 11:00:00 +0000> '01-16-2014 17:05:05' dateValue is <2014-01-16 16:05:05 +0000> '01-16-2014 T 17:05:05 UTC' dateValue is <2014-01-16 17:05:05 +0000> '17:05, 1 January 2014 (UTC)' dateValue is <2014-01-01 16:05:00 +0000> |
eppz!kit的一部分,从GitHub获取NSString + EPPZKit.h类别。
原始答案2013:
无论您是否(或不关心)字符串中包含的日期格式,请使用NSDataDetector来解析日期。
1 2 3 4 5 6 7 8 9 10 11 | //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; }]; |
使用固定格式日期时,您需要将日期格式化程序区域设置为
取自数据格式指南
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或更高版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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 }() } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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) } } |
用法:
1 2 3 4 5 6 | // 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" |
解析自定义日期并将日期转换回相同的字符串格式:
1 2 3 4 5 6 7 | let dateString ="01/02/10" if let date = dateString.customDate { print(date.customDate) //"01/02/10 " print(date.monthName) // customDate } |
在这里,您可以使用所有元素来根据需要自定义它:
为什么不向NSString添加类别?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | // 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]; |
使用"10"代表一年并不好,因为它可能是1910年,1810年等。你可能应该使用4位数。
如果你可以改变日期
1 | yyyymmdd |
然后你可以使用:
1 2 3 4 5 6 7 8 9 | // 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]; |
1 2 3 4 5 6 7 | 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]; |
1 2 3 4 5 6 7 8 9 10 11 | // 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]; |
使用此方法从
1 2 3 4 5 6 7 | -(NSDate *)getDateFromString:(NSString *)pstrDate { NSDateFormatter* myFormatter = [[NSDateFormatter alloc] init]; [myFormatter setDateFormat:@"dd/MM/yyyy"]; NSDate* myDate = [myFormatter dateFromString:pstrDate]; return myDate; } |
1 2 3 4 5 6 | NSString *mystr=@"Your string date"; NSCalendar *cal = [NSCalendar currentCalendar]; NSDate *now = [dateFormatter dateFromString:mystr]; Nslog(@"%@",now); |
如果要设置格式,请使用以下代码:
1 2 3 4 5 6 7 8 9 10 11 | 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]); |
如果有人有兴趣在Swift这样做这样的事情,我有一个开始的东西,虽然它并不完美。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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() } |
NSString的日期
1 2 | NSString *dateString = [NSString stringWithFormat:@"%@",[NSDate date]]; NSLog(@"string: %@",dateString ); //2015-03-24 12:28:49 +0000 |
NSString到NSDate
1 2 3 4 | 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 |
字符串到目前为止
1 2 3 4 | var dateFormatter = DateFormatter() dateFormatter.format ="dd/MM/yyyy" var dateFromString: Date? = dateFormatter.date(from: dateString) //pass string here |
字符串日期
1 2 3 | var dateFormatter = DateFormatter() dateFormatter.dateFormat ="dd-MM-yyyy" let newDate = dateFormatter.string(from: date) //pass Date here |
最佳实践是建立一个通用类,您可以将所有常用方法,方法用于几乎所有项目,并将@Pavan建议的代码添加为:
1 2 3 4 5 6 7 8 9 10 | + (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; } |
..等等所有其他有用的方法
通过这样做,您可以开始为您的应用程序构建一个干净的可重用代码。
干杯!
按照Swift 2.2
您可以从NSDate中的String和String中轻松获取NSDate。
例如
首先设置日期格式化程序
1 2 3 4 | let formatter = NSDateFormatter(); formatter.dateStyle = NSDateFormatterStyle.MediumStyle formatter.timeStyle = .NoStyle formatter.dateFormat ="MM/dd/yyyy" |
现在从字符串获取日期,反之亦然。
1 2 3 4 | let strDate = formatter.stringFromDate(NSDate()) print(strDate) let dateFromStr = formatter.dateFromString(strDate) print(dateFromStr) |
现在享受。
NSString到NSDate或NSDate到NSString
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //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; } |
以上示例不仅仅是针对Swift 3.0+编写的
更新 - Swift 3.0+ - 将日期转换为字符串
1 2 3 4 | 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) |
您可以使用扩展名。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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) } } |
因此,执行实际代码将如下所示
1 2 3 4 | var dateObjFromString = NSDate(dateString: cutDateTime) var dateString = dateObjFromString.getDate() var timeString = dateObjFromString.getTime() var stringFromDate = dateObjFromString.getString() |
还有一些默认方法,但我想它可能不适用于您从文档中提供的格式
1 2 3 4 5 | -dateFromString(_:) -stringFromDate(_:) -localizedStringFromDate(_ date: NSDate, dateStyle dateStyle: NSDateFormatterStyle, timeStyle timeStyle: NSDateFormatterStyle) -> String |