26

次のコードをOS3.xで動作させました

NSString *stringDate = @"2010-06-21T20:06:36+00:00";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
NSDate *theDate = [dateFormatter dateFromString:stringDate];
NSLog(@"%@",[dateFormatter stringFromDate:theDate]);

しかし、iOS4シミュレーターの最新のxcode 3.2.3では、変数theDateはnilです。

私はクラスリファレンスを調べましたが、これらの特定のメソッドを使用したiOS4で非推奨または実装が異なるものはありません。何を省略しましたか?

4

13 に答える 13

41

このようにするとうまくいくことがわかりました(以下を参照)。重要なのは、次の方法を使用することです。 - [NSDateFormatter getObjectValue:forString:range:error:]

それ以外の

-[NSDateFormatter dateFromString]

完全なコード:

+ (NSDate *)parseRFC3339Date:(NSString *)dateString 
{
    NSDateFormatter *rfc3339TimestampFormatterWithTimeZone = [[NSDateFormatter alloc] init];
    [rfc3339TimestampFormatterWithTimeZone setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
    [rfc3339TimestampFormatterWithTimeZone setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];

    NSDate *theDate = nil;
    NSError *error = nil; 
    if (![rfc3339TimestampFormatterWithTimeZone getObjectValue:&theDate forString:dateString range:nil error:&error]) {
        NSLog(@"Date '%@' could not be parsed: %@", dateString, error);
    }

    [rfc3339TimestampFormatterWithTimeZone release];
    return theDate;
}
于 2010-10-19T12:43:34.040 に答える
8

デバイスは 24 時間制または 12 時間制に設定されていますか?

それは非常識な質問のように聞こえますが、私はちょうどそのバグに遭遇しました.dateformatterは、時間形式の設定を含む現在のロケールに従ってフォーマット文字列を調整します.

次の行を追加して、それらを無視するように強制できます。

dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];

それが役立つことを願っています。

于 2010-06-22T16:09:17.783 に答える
5

このコードは、AtomRiot が説明するように、余分なコロンを削除します。

からの変換:

  • NSString *stringDate = @"2010-06-21T20:06:36+00:00";

に:

  • NSString *stringDate = @"2010-06-21T20:06:36+0000";
// Remove colon in timezone as iOS 4+ NSDateFormatter breaks
if (stringDate.length > 20) {
    stringDate = [stringDate stringByReplacingOccurrencesOfString:@":"
                                                       withString:@""
                                                          options:0
                                                            range:NSMakeRange(20, stringDate.length-20)];
}

詳細については、https ://devforums.apple.com/thread/45837 を参照してください。

于 2010-08-21T11:29:05.387 に答える
2

私は最近この問題に遭遇しました。結局、PeterHoseyのISO8601パーサーを使用しました。ここで入手できます:http://boredzo.org/iso8601unparser/

于 2010-06-26T17:05:52.450 に答える
2

Appleのドキュメントは、まあ、「トリッキー」のようです:

フォーマット文字列は、Unicode標準のフォーマット パターンを使用します (この参照は 、Mac OS X v10.5 の場合はバージョンtr35-6に対するものであり、Mac OS X v10.4 の場合はバージョンtr35-4を使用します)。

iOS : v10.0 互換モードは iOS では使用できません。使用できるのは10.4 モードのみです。

バージョンtr35-4によると:

GMT 形式には 1、RFC 822 には 2 を使用します。

Z{1} GMT-08:00
Z{2} -0800

しかし、Unicode標準によると:

RFC 822 では 1 ~ 3 文字、GMT 形式では 4 文字を使用します。

Z{1,3} -0800
Z{4} GMT-08:00

したがって、iOS 4 はtr35-6 (Unicode 標準)を使用しているように見えます。これが、+ 00:00が「Z」に対して失敗する理由です。

NSDateFormatter で 'ZZZZ' に対して-08:00を試しましたが、iOS 4で失敗しました。ただし、GMT-08:00は機能しました。タイムゾーン (GMT) は、iOS 3 のようにオプションではなく、必須になっているようです。

于 2011-02-08T20:44:00.607 に答える
1

私が与えられている形式は、RFC 822 と GMT の中間です。「+00:00」を「+0000」に変更すると、フォーマットで「Z」を使用できます。「GMT+00:00」に変更すると、ZZZZ を使用してデータを適切に取得できます。以前は OS 3.x で動作していたので、このハイブリッドを処理するために何かが取り除かれているようです。

于 2010-07-08T20:59:32.030 に答える
1

dataFormat から値を取得します@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'+'hh:mm"

于 2010-06-26T17:56:20.700 に答える
0

エルフレッドが投稿したリンクがそのトリックでした。アプリを3.1.3からiOS4に変換しているときに、同じ問題が発生しました。リンクにはISO8601DateFormatterクラスがあります。これは、私自身の日付ユーティリティクラスよりもはるかに優れた拡張機能です。

エルフレッドは書いた:私は最近この問題に遭遇した。結局、PeterHoseyのISO8601パーサーを使用しました。ここで入手できます:http://boredzo.org/iso8601unparser/

于 2010-06-30T22:05:24.663 に答える
0

NSDateFormatter は非常にうるさいようです。

-(void)dateFormatterTests {
    NSDateFormatter *formatter;

    formatter = [[NSDateFormatter alloc] init];

#ifdef WORKS
    [formatter setDateFormat:@"yyyy-MM-dd"];
#elif defined(ALSO_WORKS)
    [formatter setDateFormat:@"yyyy MM dd"];
    [formatter setLenient:YES];
#else // DOESN'T WORK
    [formatter setDateFormat:@"yyyy MM dd"];
#endif

    // Works per comments above
    NSLog(@"dFS: %@", [formatter dateFromString:@"2010-01-13"]);  
    // Never works with any of the above formats
    NSLog(@"dFS: %@", [formatter dateFromString:@"2010-01-13 22:00"]); 

    [formatter release]; formatter = nil;
}
于 2010-07-10T20:47:35.530 に答える
0

私のアプリでもNSDateFormatter の Null Valueと同じ問題がありました。

私の問題は次のとおりです。

07/16/2010 04:21:00 +00:00次のようなフォーマッタを使用して、アプリに次のような日付と時刻を送信していました。[dateFormatter setDateFormat:@"MM/dd/yyyy HH:mm:ss ZZZ"]

ZZZ書式設定の一部がコロンを受け入れないようです: in the time.

作品:07/16/2010 04:21:00 +0000

動作しません:07/16/2010 04:21:00 +00:00

現在公開されているアプリをサポートするため+00:00に、文字列内の部分を検索して に置き換えるだけ+0000でした。

これが他の人に役立つことを願っています。

于 2010-07-21T12:52:04.947 に答える
0

このまったく同じ問題をデバッグしていました。4.0 ではなく 3.x で動作する、あなたと同じ日付文字列があります。同じ症状です。

NSDateFormatter のドキュメントを見ると、次のように表示されます。

日付フォーマッタの初期化 – init iPhone OS 2.0 から iPhone OS 3.2 で利用可能

これは、init メソッドが iOS 4.0 で非推奨になったことを示しています。それが何を意味するのかわかりません。

于 2010-06-27T02:55:32.133 に答える
0

私にはうまく見えます。

実際のデバイスでも正しく機能しますか?

その場合は、シミュレーターのバグ レポートを提出してください。それ以外の場合は、iOS 4 のバグ レポートを提出してください。

于 2010-06-22T15:58:13.273 に答える
0

私はそれを次のように簡単に使用しています:

date_formatter = [[NSDateFormatter alloc] init];
        [date_formatter setDateStyle:NSDateFormatterShortStyle];
        [date_formatter setTimeStyle:NSDateFormatterNoStyle];

これはうまく機能しています。NSDateFormatter クラスが NSObject からサブクラス化されている場合、init メソッドを非推奨にする方法がわかりません

于 2010-11-02T11:16:23.687 に答える