2013-08-12 11 views
8

私のコンピュータ(地域設定米国)では、デフォルトの "短い"日付形式は "1/5/13"(月/日/年)に設定されています。週番号を含むNSDateFormatterの問題

システム環境設定では、週番号「1/5/13 1」を追加しました。私のマシン上で

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateStyle:NSDateFormatterShortStyle]; 
NSDate *date = [dateFormatter dateFromString:@"1/5/13 1"]; 
NSLog(@"Date: %@", date); 

、この版画:ないを、だ

Date: 2000-01-01 05:00:00 +0000 

私の問題は、私がこれまでに文字列を変換しようと、このコードは、ありますさらにに近い

この問題の原因は何ですか?あなたがNSDateFormatterdateFromString方法を使用する必要が

+0

? nsdateformatterを使用して取得します。 btw: '-dateFromString:'を使うべきです。私はあなたがドキュメントを参照する必要があり、だと思います。 http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html – vikingosegundo

+0

@vikingosegundo私は 'dateFromStringを使用するようにコードを変更:'、結果は同じです。ポイントは、私は今週の番号を追加しているわけではありません:)ポイントは、私の**ユーザ**が、システム環境設定で今週の番号を追加していて、私のアプリが正しい日付に変更していないということです。 –

+0

私はシステム環境設定で同じことをした後、短いスタイルの日付フォーマッタを設定し、 'NSString * dateString = [formatter stringFromDate:[NDate date]];を実行しました。 NSDate * parsedDate = [フォーマッタdateFromSTring:dateString]; 'と同じ問題が発生しました。 'dateString'は私の好みに従ってフォーマットされましたが、フォーマッタは同じ文字列を正しく解析しませんでした!私は他のスタイルと同様に、スタイルとCFDateFormatterを同じような変更で試しました!フレームワークのバグでしょうか? –

答えて

8

私はこの議論に遅刻し、提供するソリューションの数を見てきましたが、私はそれらすべてを間違って参照すると、互換性のない2つの日付の書式要素が一緒に使用されていることです。日付を取得しようとしている文字列がNSDateFormatterShortStyleと一致しないため、元の方法は失敗しました。

今年の週を評価する場合は、年の大文字の形式を使用する必要があります。これは、「年の週」のような種類のカレンダーを提供します。私は今年のためにその大文字のフォームを使用してい

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MM/dd/YY w"]; 
NSDate *date = [dateFormatter dateFromString:@"1/5/13 1"]; 
NSLog(@"Date: %@", date); 

注:新しいフォーマットが含まれるように

てみましょう、あなたのオリジナルのコードを再作業ビット。年間の週に

Date: 2013-01-05 08:00:00 +0000 

及び2と:今年の週の1で、私はこれを取得

Date: 2013-01-12 08:00:00 +0000 

と3で:

Date: 2013-01-19 08:00:00 +0000 

理にかなっています、そう?日付の日は、各増分を週のいずれかで7日間増分します。当然のことながら、時間はついていましたが、私たちはその分野で評価することについて決して議論しませんでしたか?フリップuはこの番号を追加しない理由

+1

+1これは私がそれを行う方法とほとんど同じです。ただし、構文解析しようとしている文字列の日付で表されるロケールにフォーマッタの 'locale'プロパティを設定することで、異なるロケールを考慮してください。これは、(例えば)私がタイにいた場合、2013年が500年以上前だった場合、これは完全に失敗するでしょう。一般に、ロケールを 'en_US_POSIX'に設定すると、コンピュータ生成の日付文字列に対してうまく機能します。 –

+0

"あなたの日付を取得しようとしている文字列がNSDateFormatterShortStyleが提供する文字列と一致しないため、元の方法が失敗しました。アサーションについてもっと詳しく説明できますか? –

+0

@CarlVeazey ShortStyleには任意の数のバリエーションを含めることができます(OS X上でユーザーが変更できるため)。また、週番号は決して含まれません。 –

-1

...

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"mm/dd/yyyy"]; 
NSDate *myDate = [dateFormatter dateFromString:@"1/5/2013"]; 
NSLog(@"Date: %@", myDate); 

あなたは週番号を再生したい場合は、あなたの必要性に基づいてNSCalendarNSDateComponentsを使用して...(このコードスニペットを参照してください)

NSCalendar *cal = [NSCalendar currentCalendar]; 
NSDateComponents *components = [cal components:NSWeekCalendarUnit fromDate:date]; 
NSInteger week = [components week]; 

こちらがお役に立てば幸いです。

2
NSDateComponents *cmp=[[[NSDateComponents alloc]init]autorelease]; 
[cmp setWeek:1]; 
NSCalendar *cal=[[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
NSDate *dte=[NSDate date]; 
NSDate *weekDate=[cal dateByAddingComponents:cmp toDate:dte options:0]; 
[dateFormatter setDateFormat:@"MM/dd/YY"]; 
NSString *strDate=[dateFormatter stringFromDate:weekDate]; 
NSLog(@"Date: %@", strDate); 
関連する問題