我有一个包含当前日期的字符串:
NSString *date = [[NSDate date] description];
在另一点上,我想从这个字符串中检索日期,我使用了以下代码:
[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。我做错了什么?
答案 0 :(得分:64)
您不能发明格式字符串语法并期望它能够工作;你需要实际使用文档格式。 (说真的,“MM”意思是“月”,“分钟”和“GMT偏移分钟”都在同一时间?)
正如documentation指出的那样,10.4格式化程序使用Unicode format strings。
尝试“yyyy-MM-dd HH:mm:ss ZZZ”。
另外,Objective-C源是ASCII。不要把像这样的字符放在那里,并希望它能在任何环境中工作;相反,使用字符串文件。
答案 1 :(得分:7)
此外,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
希望这可以拯救某人:)
答案 2 :(得分:3)
为此制作了 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!kit的一部分,从GitHub获取类别NSString+EPPZKit.h。
原始答案:无论您是否(或只是不关心)字符串中包含的日期格式,使用NSDataDetector解析日期。
//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 :(得分:2)
您可以查看TouchTime。
https://github.com/jheising/TouchTime
对于Cocoa和iOS,它是PHP中令人敬畏的strtotime函数的直接端口。它将采用几乎任意格式的日期或时间字符串并将其转换为NSDate。
希望它有效,并享受!
答案 4 :(得分:-1)
如前所述,当您发明新的sytax时会发生这种情况。
基于Apple NSDateFormatter Class Reference文档
您可以在样式日期获取和设置许多属性 格式化程序,... 但是,我们鼓励您不要更改个人设置。相反,你应该接受在初始化时建立的默认设置和使用setDateStyle指定格式,setTimeStyle:
这对输出特别重要,对于每个语言环境都是不同的。默认情况下,NSDateFormatter会观察当前用户的区域设置。因此,对于相同的输入和相同的代码,相同的NSDate可以是22.11.2011 18:33:19
,Nov 22, 2011 6:33:19 PM
,2011-11-22 下午6:33:19
或甚至२२-११-२०११ ६:३३:१९ अपराह्
。
考虑这个代码
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterShortStyle];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
// ShortStyle used: 11/23/37 3:30pm
NSString *dateString = [dateFormatter stringFromDate:date];
检查Apple文档,了解NSDateFormatterStyle或此excellent tutorial
的不同样式