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"

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

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

4

3 回答 3

4

您将获得 BST 午夜(格林威治标准时间 + 1 小时),与格林威治标准时间 23:00 (+0000) 相同。

[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 回答