0

以下は日付を表す文字列です

NSString *dateStr = @"2011-07-06";

そして、私がそれをNSDateに変換しようとしているとき:

    NSDateFormatter *format         =   [[NSDateFormatter alloc] init];

    [format setDateFormat:@"yyyy-MM-dd"];
    NSDate      *tmp                =   [format dateFromString:dateStr];
    NSLog(@"tmp  is %@",[tmp description]);

私がコンソールから得ているのは

tmp  is 2011-07-06 04:00:00 +0000

なぜ私が追加情報を取得しているのかわかりません:04:00:00 +0000結果のために

以前に経験したことがあるなら助けてください

4

2 に答える 2

2

Your code

NSString *dateStr = @"2011-07-06";
NSDateFormatter *format         =   [[NSDateFormatter alloc] init];

[format setDateFormat:@"yyyy-MM-dd"];
NSDate      *tmp                =   [format dateFromString:dateStr]

will result in a NSDate object, that represents your local time at 0:00 — the beginning of the day.

but if you print a plain date object, it will result in a string that represents the time in GMT timezone, as internally all dates are normalized to that timezone.

As your string is 4 hours ahead, we can tell, that you most likely are in East Europe, maybe Moscow.

So if you want to see the string in your timezone, you need to use a NSDateFormatter to create it from the date object.

NSLog(@"tmp  is %@",[formatter stringFromDate:tmp]);

to check, if it is correct, what I said, change the format to contain the time components.

formatter.format = [@"yyyy-MM-dd HH:mm"];
NSLog(@"tmp  is %@",[formatter stringFromDate:tmp]);

The formatter will also take "oddities" like Leap Day, Leap Month (yes — those exits), Daylight Saving Times, Leap Seconds … in account — accordantly to the current calendar.


A great WWDC 2011 Video: Performing Calendar Calculations — a must-see for every cocoa developer.


BTW: to print a object with NSLog you dont need to call -description on it to pass in a string. NSLog will do this internally.

NSLog(@"tmp  is %@", tmp);

is just fine.

于 2013-03-14T19:32:27.260 に答える
1

答えは簡単です。GMT (ゼロ) タイムゾーンのフォーマッターを使用して、 をNSLogに変換するだけです。NSDateNSString

フォーマッタは、デフォルトでデフォルトのタイムゾーンに設定されています。これはおそらく-4:00. 印刷すると、 にNSLog変換され0:00、4 時間が加算されます。

一般に、タイムゾーンを指定せずに日付を解析するのは安全ではありません。

于 2013-03-14T19:44:08.003 に答える