2012-07-07 69 views
3

我见过以下代码的许多版本,以便从NSDate中删除时间元素。剥离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”

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

回答

4

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

[NSDate date]将在当前时区返回一个日期,所以你的日期是BST。您是否也尝试设置时区为GMT:

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

这没有窍门,谢谢。尽管如此,我必须承认,这看起来确实违背了直觉上面的“现在”日期是在BST中......在我的原始代码中,正如你所说,正在返回的是GMT时间。将组件时区设置为GMT似乎很奇怪。这是否可以在任何时区使用 - 例如:如果现在是在美国东部时间? – 2012-07-08 21:55:01

+0

对不起,刚才注意到上面的“现在”日期确实在GMT。 – 2012-07-08 22:59:49

0

添加

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

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

+0

对不起...没有区别。我甚至尝试减去时间值从现在剥离他们到组件和减法 - 每次相同的结果 – 2012-07-07 22:02:46

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. 

技术上的第一位(设定时间部分到午夜的)是没有必要的,如果你只是没有格式化的时间日期,但你可以将它留在如果它让你觉得你实际上是“消磨时间”。 :)

+0

感谢您的输入......我想要做的就是存储日期,然后将它们在线下进行比较,无需担心日期的时间部分......我意识到我可以在比较步骤中忽略时间元素,但是这似乎效率低下,为什么我想把时间设定为每个我存储日期的午夜。 – 2012-07-08 21:44:54

+0

+1,这正是我的问题:)谢谢! – tyler53 2013-10-08 01:21:24