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

私は0x0dateFromStringとして取得しています。nil私は何が間違っているのですか?

4

5 に答える 5

64

フォーマット文字列構文を発明して、それが機能することを期待することはできません。実際に文書化された形式を使用する必要があります。(真剣に、「MM」は「月」、「分」、「GMTオフセット分」をすべて同時に意味しますか?)

ドキュメントが指摘しているように、10.4フォーマッタはUnicodeフォーマットの文字列を使用します。

代わりに「yyyy-MM-ddHH:mm:ssZZZ」を試してください。

また、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を取得します。


元の回答:文字列に含まれる日付形式が不明な場合 (または気にしない場合) は、 dateの解析に 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; }];
于 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 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];

NSDateFormatterStyleのさまざまなスタイルまたはこの優れたチュートリアルについては、Apple ドキュメントを確認してください

于 2012-08-09T13:06:56.147 に答える