【问题标题】:Stripping the time out of an NSDate剥离 NSDate 的时间
【发布时间】:2012-07-07 20:19:06
【问题描述】:

我见过以下代码的多个版本,用于从 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"

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

【问题讨论】:

    标签: cocoa nsdate nscalendar nsdatecomponents


    【解决方案1】:

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

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

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

    【讨论】:

    • 成功了,谢谢。我必须承认,这似乎真的违反直觉。上面的“现在”日期是 BST ......在我的原始代码中,正如你所说,返回的是 GMT 日期。将组件时区设置为 GMT 似乎很奇怪。这是否适用于任何时区 - 即:如果现在在美国东部时间?
    • 抱歉,刚刚注意到上面的“现在”日期确实是格林威治标准时间。
    【解决方案2】:

    没有没有时间的日期,因为从来没有一个时间点没有时间(无论如何,根据我们当前的日历系统),日期只是一个时间点。因此,日期必然必须有时间。

    可以做的,是格式化一个不显示时间的日期。为此,您使用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.
    

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

    【讨论】:

    • 感谢您的输入...我想要做的是存储日期然后比较它们而不用担心日期的时间部分...我意识到我可以忽略时间元素在比较步骤中,但这似乎效率低下,这就是为什么我想为我存储的每个日期将时间设置为午夜。
    【解决方案3】:

    添加一个

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

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

    【讨论】:

    • 对不起...没有区别。我什至尝试通过将时间值从现在剥离到一个组件中来减去时间值并减去 - 每次都得到相同的结果
    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多