0

NSString を NSDate に変換する際に問題が発生しています。

これが私のコードです:

NSLog(@"Unformatted date: %@", [d objectForKey:@"pubDate"]);

// Set the publication date as an NSDate
static NSDateFormatter *dateFormatter = nil;
if (!dateFormatter) {
    dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"EEE, dd MMM yyyy"];
}
[self setPublicationDate:[dateFormatter dateFromString:[d objectForKey:@"pubDate"]]];

NSLog(@"Date object: %@", [self publicationDate]);
NSLog(@"Date object description: %@", [[self publicationDate] description]);

これが実行されると、次のメッセージがログに記録されます (これは数回実行されます。ログ メッセージは 2 セットだけ含まれています)。

2012-08-14 12:47:28.446 (App name removed)[9009:707] Unformatted date: Mon, 02 Apr 2012
2012-08-14 12:47:28.454 (App name removed)[9009:707] Date object: (null)
2012-08-14 12:47:28.460 (App name removed)[9009:707] Date object description: (null)
2012-08-14 12:47:28.467 (App name removed)[9009:707] Unformatted date: Sun, 25 Mar 2012
2012-08-14 12:47:28.474 (App name removed)[9009:707] Date object: (null)
2012-08-14 12:47:28.480 (App name removed)[9009:707] Date object description: (null)

iOS 5.1.1 を実行している iPad touch でこのコードをテストしています。

受信する日付の形式を変更でき"D, d M Y"ます。現在、形式文字列として使用されている PHP 日付関数から送信されています。

誰かが私が間違っているところを見てもらえますか? ご協力ありがとうございました。

更新 1: 切り替えて、デバイスではなくシミュレーターで実行しましたが、何らかの理由で機能しました。デバイスで動作しない理由について何か提案はありますか? シミュレーターは iOS 5.1 を実行しており、デバイスは iOS 5.1.1 を実行しています。

更新 2: 一部の人々は、より多くの情報を要求してきましたが、publicationDateこれは合成されたプロパティです。

.h ファイル内:

@property (nonatomic, strong) NSDate *publicationDate;

.m ファイル内:

@synthesize publicationDate;

コードをさらに分割しました。

NSLog(@"Unformatted date: %@", [d objectForKey:@"pubDate"]);
NSLog(@"Unformatted date class type: %@", [[d objectForKey:@"pubDate"] class]);

// Set the publication date as an NSDate
static NSDateFormatter *dateFormatter = nil;
if (!dateFormatter) {
    dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"EEE, dd MMM yyyy"];
}
NSString *dateString = [d objectForKey:@"pubDate"];
NSLog(@"dateString: %@", dateString);

NSDate *formattedDate = [dateFormatter dateFromString:dateString];
NSLog(@"formattedDate %@", formattedDate);
[self setPublicationDate:formattedDate];

NSLog(@"Date object: %@", [self publicationDate]);
NSLog(@"Date object description: %@", [[self publicationDate] description]);

そしてそれは今ログに記録します:

2012-08-14 13:45:35.335 (app name removed)[9167:707] Unformatted date: Sun, 25 Mar 2012
2012-08-14 13:45:35.342 (app name removed)[9167:707] Unformatted date class type: __NSCFString
2012-08-14 13:45:35.347 (app name removed)[9167:707] dateString: Sun, 25 Mar 2012
2012-08-14 13:45:35.353 (app name removed)[9167:707] formattedDate (null)
2012-08-14 13:45:35.359 (app name removed)[9167:707] Date object: (null)
2012-08-14 13:45:35.365 (app name removed)[9167:707] Date object description: (null)

更新 3: 成功! 日付フォーマッタを次のように変更することにより:

// Set the publication date as an NSDate
static NSDateFormatter *dateFormatter = nil;
if (!dateFormatter) {
    dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
    [dateFormatter setDateFormat:@"EEE, dd MMM yyyy"];
}

それは今動作します。テスト対象のデバイスがオランダの設定に設定されていることは言及していませんでした (これはオランダの開発会社であるため)。申し訳ありませんが、これがここのコードの動作に影響を与える可能性があるとは思いもしませんでした。

4

4 に答える 4

2

次のコードから文字列オブジェクトを取得していますか?

[d objectForKey:@"pubDate"]

から返されたオブジェクトのクラスをログに記録してみてくださいd。それ以外の場合、コードは問題ないようです。

編集: デバイスのロケール設定を確認します: デバイスの [設定]、[一般]、[インターナショナル] に移動します。Region Format が English に設定されていない場合は、dateformatter で setLocale メソッドを使用する必要があります。詳細については、この質問に対する受け入れられた回答を確認してください。NSDateFormatter で日付をどのように解釈しますか?

于 2012-08-14T11:11:09.470 に答える
1

ライブデータがなく、正常に動作するため、コードを貼り付けてマイナーな変更を加えました。以下はそのサンプルコードです...

NSString *strDate = @"Mon, 02 Apr 2012";
NSLog(@"Unformatted date: %@", strDate);

// Set the publication date as an NSDate
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"EEE, dd MMM yyyy"];
NSDate *publicationDate = [dateFormatter dateFromString:strDate];    
NSLog(@"Date object description: %@", [publicationDate description]);

下の行を置き換えます

[self setPublicationDate:[dateFormatter dateFromString:[NSString stringWithFormat:@"%@",[d objectForKey:@"pubDate"]]]];

既存のコードで確認してください。

[self setPublicationDate:[dateFormatter dateFromString:[d objectForKey:@"pubDate"]]];
于 2012-08-14T11:13:34.373 に答える
0

たぶん、日付オブジェクトをに渡していますdateFromString

NSDate *rawDate = [d objectForKey:@"pubDate"];
NSString *stringDate = [dateFormatter stringFromDate:rawDate];
NSDate *newDate = [dateFormatter dateFromString:stringDate];

また、操作の結果をdateFromString:個別に確認する必要があります ( の assign ステートメント内ではありませんpublicationDate)。

于 2012-08-14T11:11:27.577 に答える
0

[d objectForKey:@"pubDate"]の値が適切な日時形式ではありません。

標準時間形式を使用して、この出力を得ました..(例としてそれを取りました)

NSDateFormatter *dateFormatter = nil;
if (!dateFormatter)  
{  
    dateFormatter = [[NSDateFormatter alloc] init];  
    [dateFormatter setDateFormat: @"EEE, dd MMM yyyy"];  
}

NSLog(@"todays date: %@", [NSDate date]);  
NSLog(@"formated date: %@", [dateFormatter stringFromDate:[NSDate date]]);

出力:

todays date: 2012-08-14 11:23:37 +0000  
formated date: Tue, 14 Aug 2012
于 2012-08-14T11:31:55.353 に答える