NSString到NSDate

时间:2009-08-30 04:26:22

标签: cocoa nsstring nsdate nsdateformatter

我有一个包含当前日期的字符串:

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

我的dateFromStringnil 0x0。我做错了什么?

5 个答案:

答案 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:19Nov 22, 2011 6:33:19 PM2011-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

的不同样式