10

NSDateFormatter日付文字列を取得して日付比較を実行できるようにフォーマットするアプリで使用しようとしていますNSDateが、dateFromStringを使用してフォーマットすると、日付が1日失われます。

NSString *dateString = @"02-06-2012";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd-MM-yyyy"];
NSDate *dateFromString = [[NSDate alloc] init];
dateFromString = [dateFormatter dateFromString:dateString];
NSLog(@"My Date = %@", dateFromString);
[dateFormatter release];

これはコンソールに出力します:

私の日付=2012-06-0123:00:00 +0000

4

2 に答える 2

49

この行をコードに追加してみてください。

[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT+0:00"]];

また

[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];

SWIFTアップデート:

質問からのコード、

let dateString = "02-06-2012"
var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy"
var dateFromString : NSDate = dateFormatter.dateFromString(dateString)!
println("My Date \(dateFromString)")

そしてソリューション、

dateFormatter.timeZone = NSTimeZone(name: "GMT")

また

dateFormatter.timeZone = NSTimeZone(abbreviation: "GMT+0:00")
于 2012-06-30T09:26:34.303 に答える
20

Dhruvの答えが正しいとは思わない。実際、問題があるかどうかは明らかではありません。あなたは、何が起こるべきか、および/または何が起こっているのかについての解釈について誤った期待を持っているようです。

NSDateある瞬間を表します。この瞬間には、1つの一意の名前はありません。それは、さまざまな場所でさまざまな命名システム(タイムゾーン、カレンダー)の下でさまざまな名前で知られています。その瞬間の文字列表現を生成する必要があるNSDateそのメソッドを除いて、これのいずれも処理しません。-description

次に、「02-06-2012」のような文字列は、正確な時刻を指定しません。まず第一に、それは時間情報のない単なる日付なのでNSDateFormatter、デフォルトではその日付の最初の瞬間になります。次に、タイムゾーンを指定しません。暦日の最初の瞬間は、各タイムゾーンで異なる瞬間です。でタイムゾーンを指定する-setTimeZone:か、文字列自体にタイムゾーン情報が含まれていない限りNSDateFormatter、解析を要求する日付文字列はすべて現在のタイムゾーンにあると見なされます。

したがって、dateFromStringオブジェクトは、指定された日付の最初の瞬間である2012年2月6日をタイムゾーンで表します。これがあなたが望んでいたことだと思います。ただし、NSDateログに記録されたときに自分自身を説明する方法に混乱しました。私が言ったように、NSDateそれが表す瞬間にいくつかの「名前」(文字列表現)を選択する必要があり、どの名前を選択するかはかなり任意です。最近では、UTCでその瞬間が知られている名前を選んでいます。私はあなたの質問に示されたログ出力からあなたがUTC+0100にいることを収集します。そのため、日付は1日前のように見えるかもしれませんが、実際には指定した瞬間と同じです。つまり、「2012-06-01 23:00:00+0000」と「2012-06-0200:00:00 +0100」は、まったく同じ瞬間の2つの同等の名前です。あなたはただではない

NSDate教訓は、特定のタイムゾーンにあるためにの自己記述に依存するのをやめなければならないということです。本当に、それは文書化されていないので、あなたはそれについて何にも頼る必要はありません。-[NSDate description]実際、 「オペレーティングシステムのさまざまなリリース間で表現が一定であることが保証されていない」という状態のドキュメント。

Dhruvのソリューションは、タイムゾーンを引き起こし、合意するという理由だけで役立つようです。しかし、それは信頼できません。たとえば、そのバージョンのフレームワークではUTCではなくローカルタイムゾーンを使用しているため、SnowLeopardでは機能しません。NSDateFormatter-[NSDate description]-[NSDate description]

ただし、さらに重要なのは、日付文字列の解釈NSDateから取得するオブジェクトによって表される実際の瞬間を変更することです。NSDateFormatter文字列がローカルタイムゾーンにあると解釈されるようにしたいという特定の意味を本当に望んでいるのではないかと思います。彼の解決策はあなたの意図を妨げます。

tl; dr:あなたはずっとあなたが望む日付を取得していました。に依存しないでください-[NSDate description]; Dhruvのソリューションを使用しないでください

于 2012-06-30T11:45:10.257 に答える