3

NSDate から時間要素を削除する次のコードの多くのバージョンを見てきました。

NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *now = [NSDate date];
unsigned int intFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *components = [cal components:intFlags fromDate:now];

NSDate *today = [cal dateFromComponents:components];

問題は、期待どおりに機能しないことです。私は現在、英国の夏時間 (BST) にいます。このコードを今実行すると、now=@"2012-07-07 19:24:06 +0000"

今日=@"2012-07-06 23:00:00 +0000"

見たいのはtoday=@"2012-07-07 00:00:00 +0000"

サマータイムと関係があるとしか思えません。何か案は?

4

3 に答える 3

4

23:00 GMT (+0000) と同じ、真夜中の BST (GMT+1 時間) を取得しています。

[NSDate date] は現在のタイムゾーンの日付を返すため、日付は BST になります。タイムゾーンを GMT に設定してみましたか:

[components setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
于 2012-07-08T00:35:58.480 に答える
1

時間のない日付などというものはありません。これは、時間のない時点は決してなく (現在のカレンダー システムによると)、日付は単なる時点にすぎないためです。したがって、日付には必然的に時間が必要です

できることは、時間が表示されないように日付をフォーマットすることです。そのためには、次を使用しますNSDateFormatter

NSDate *date = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date];

NSDate *todayAtMidnight = [calendar dateFromComponents:components];

NSString *formatted = [NSDateFormatter localizedStringFromDate:todayAtMidnight dateStyle: NSDateFormatterMediumStyle];
// "formatted" is now something like "Jul 8, 2012". 
// It varies according to your locale and user settings.

技術的には、時刻なしで日付をフォーマットするだけの場合は、最初のビット (時刻部分を真夜中に設定する) は必要ありませんが、実際に「時刻を削除している」ように感じる場合はそのままにしておくことができます。 . :)

于 2012-07-08T02:34:03.143 に答える
0

を追加

[components setHour:0];
[components setMinute:0];
[components setSecond:0];

デフォルト値の使用を避けるため。ドキュメントにはこれらの値が何であるかさえ記載されていないため、「0」ではない可能性があります。

于 2012-07-07T19:40:17.593 に答える