我见过以下代码的许多版本,用于从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”
我只能猜测它与夏令时有关。有什么想法吗?
答案 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”。