NSString到NSDate

我有一个string,包含当前date使用这个:

NSString *date = [[NSDate date] description]; 

在不同的点我想从这个string检索date,我用下面的代码:

 [NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehavior10_4]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; //[NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehaviorDefault]; [dateFormatter setDateFormat:@"YYYY-MM-DD HH:MM:SS ±HHMM"]; NSDate *dateFromString = [[NSDate alloc] init]; dateFromString = [dateFormatter dateFromString:<NSString containing date>]; 

我得到dateFromString nil 0x0。 我究竟做错了什么?

你不能发明格式string的语法,并期望它的工作; 你需要实际使用文件格式。 (严格来说,“MM”意思是“月”,“分”和“GMT偏差分”都是同时的?)

正如文档指出的那样,10.4格式化程序使用Unicode格式string 。

试试“yyyy-MM-dd HH:mm:ss ZZZ”来代替。

另外,Objective-C源代码是ASCII。 不要把字符放在那里,并期望它能在任何情况下工作。 相反,使用string文件。

另外,dateFromString:返回一个自动发布的NSDate,所以:

 NSDate *dateFromString = [[NSDate alloc] init]; // <- non freed instance dateFromString = [dateFormatter dateFromString:<NSString containing date>]; // <- new autoreleased instance .... [dateFromString release]; // <- wrong 

您可能想要:

 //NSDate *dateFromString = [[NSDate alloc] init]; NSDate *dateFromString = [dateFormatter dateFromString:<NSString containing date>]; .... //[dateFromString release]; // dateFromString is autoreleased 

希望这可以拯救一个人:)

你可以看看TouchTime。

https://github.com/jheising/TouchTime

这是Cocoa和iOS中5.4版PHP中令人敬畏的strtotime函数的直接端口。 它将采取几乎所有date或时间string的任意格式,并将其转换为NSDate。

希望它的作品,并享受!

为此做了一个NSString扩展

 // Simple as this. date = dateString.dateValue; 

感谢NSDataDetector ,它可以识别很多格式。

 // Tested in GMT+1 (Hungary). @"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!套件的一部分 ,从GitHub获取NSString + EPPZKit.h类别。


原始答案:对于string中包含的date格式,您是否不确定(或不关心),请使用NSDataDetector来parsingdate

 //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; }]; 

正如以前所回答的那样,当你发明一个新的sytax时会发生什么。

基于Apple NSDateFormatter类参考文档

有很多属性可以在样式date格式化程序中获得和设置,但是,鼓励您不要更改个别设置 。 相反,您应该接受在初始化时build立的默认设置,并使用setDateStyle :, setTimeStyle 指定格式

这对于输出来说是特别重要的,对于每个地区来说都是不同的。 默认情况下NSDateFormatter观察当前用户的区域设置。 所以相同的NSDate可能是22.11.2011 18:33:19Nov 22, 2011 6:33:19 PM2011-11-22 下午6:33:19或甚至२२-११-२०११ ६:३३:१९ अपराह् ,全部用于相同的input和相同的代码。

考虑例如这个代码

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateStyle:NSDateFormatterShortStyle]; [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; // ShortStyle used: 11/23/37 3:30pm NSString *dateString = [dateFormatter stringFromDate:date]; 

检查苹果文档NSDateFormatterStyle的不同风格或这个优秀的教程