38

通过使用这个,我得到了一个包含当前日期的字符串:

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

我得到dateFromString0x0 nil。我究竟做错了什么?

4

5 回答 5

64

您不能发明格式字符串语法并期望它起作用;您需要实际使用文档格式。(说真的,“MM”同时表示“月”、“分钟”和“GMT 偏移分钟”?)

正如文档指出的那样,10.4 格式化程序使用Unicode 格式字符串

改用“yyyy-MM-dd HH:mm:ss ZZZ”。

此外,Objective-C 源代码是 ASCII。不要把 ± 之类的字符放在那里,并期望它在任何情况下都能工作;相反,使用字符串文件。

于 2009-08-30T04:35:59.700 回答
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

希望这可以拯救某人:)

于 2010-10-08T13:09:33.837 回答
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 解析 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; }];
于 2013-07-03T10:38:07.857 回答
2

你可以看看 TouchTime。

https://github.com/jheising/TouchTime

它是 Cocoa 和 iOS 5.4 中 PHP 中很棒的 strtotime 函数的直接端口。它将接受几乎任意格式的日期或时间字符串并将其转换为 NSDate。

希望它有效,并享受!

于 2013-04-10T07:59:31.587 回答
-1

如前所述,这就是您发明新语法时发生的情况。

基于 Apple NSDateFormatter 类参考文档

您可以在样式日期格式化程序上获取和设置许多属性,......但是,我们鼓励您不要更改个别设置。相反,您应该接受在初始化时建立的默认设置并使用 setDateStyle:, setTimeStyle:指定格式:

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

考虑例如这段代码

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或这个优秀的教程

于 2012-08-09T13:06:56.147 回答