剥离NSDate的时间

时间:2012-07-07 19:29:41

标签: cocoa nsdate nscalendar nsdatecomponents

我见过以下代码的许多版本,用于从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)。如果我现在运行此代码,现在= @“2012-07-07 19:24:06 +0000”

今天= @“2012-07-06 23:00:00 +0000”

我想看到的是今天= @“2012-07-07 00:00:00 +0000”

我只能猜测它与夏令时有关。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

您正在午夜BST(GMT + 1小时),这与格林尼治标准时间23:00(+0000)相同。

[NSDate date]将返回当前时区的日期,因此您的日期是BST。您是否也尝试将时区设置为GMT:

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

答案 1 :(得分: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.

从技术上讲,如果您只是在没有时间的情况下格式化日期,那么第一位(将时间部分设置为午夜)不是必需的,但如果它让您觉得您实际上正在“删除”,则可以将其保留时间”。 :)

答案 2 :(得分:0)

添加

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

避免使用默认值。文档甚至没有说出这些值是什么,所以它们可能不是“0”。