【问题标题】:Comparing NSDates to determine day or night?比较 NSDates 以确定白天还是黑夜?
【发布时间】:2010-12-15 19:29:25
【问题描述】:

我正在解析一个天气 XML,它为我提供了用户位置的日出 + 日落时间。我将它们解析为字符串,它们看起来像这样:例如7:20 am5:34 pm

然后我通过这样做将这两次转换为NSDate

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"hh:mm a"];
NSDate *Sunrise = [dateFormat dateFromString:sunrise]; 
NSDate *Sunset = [dateFormat dateFromString:sunset];
NSDate *today = [NSDate date];      
[dateFormat release];

现在我要比较三个日期,以确定当前时间是晚上还是白天。问题是,当我 NSLog 日出和日落时间时,我看到年份都是 1970 来自字符串的日期。我不知道从哪里开始比较日期。有什么想法吗?

【问题讨论】:

    标签: iphone objective-c cocoa-touch nsdate nsdateformatter


    【解决方案1】:

    实际上有一个非常简单的方法可以做到这一点。 NSDateFormatter 有一个名为setDefaultDate: 的方法,它基本上使用给定的日期对象来填充日期格式字符串未包含的任何字段。因此,使用示例中的变量:

    [dateFormat setDefaultDate:today];
    

    只需将此行放在对dateFromString: 的调用之前,您就可以开始了。

    参考:NSDateFormatter Class Reference

    【讨论】:

    • 那太好了,我以后会用它。谢谢!
    • 哇,这对我来说是新的,我想我现在必须重构一些代码;)
    【解决方案2】:

    您可以将 NSDate 拆分为日期组件,您需要一个 NSCalendar 对象并告诉它为您的日期提供一个 NSDateComponents 实例。

    像这样:

    NSCalendar *gregorian = [NSCalendar currentCalendar];
    NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
    NSDate *date = [NSDate date];
    NSDateComponents *comps = [gregorian components:unitFlags fromDate:date];
    NSLog(@"Parts: Day %d, Month %d, Year %d", [comps day], [comps month], [comps year]);
    

    代替示例“unitFlags”,您可以将任何 NS*CalenderUnit 标志或在一起,以将相应的元素放入“comps”。在您的情况下,它将类似于 NSHourCalenderUnit | NSMinuteCalenderUnit .

    【讨论】:

    • 对我的需求来说可能有点复杂,但感谢您的帮助。
    【解决方案3】:

    尝试更改您的日出和日落 NSString 变量以包含当前日期。像“2010-12-15 7:20am”这样的东西。解析后,您的日出和日落日期将是正确的,并且比较应该很容易。

    【讨论】:

    • 因为这将是动态的;我无法更改 XML 文件中的日期。
    • 您可以控制传递给 dateFromString 的字符串。可能就像在函数中附加“今天”和“今天晚上 7.20”一样简单。 dateFromString 相当聪明。
    猜你喜欢
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多