【问题标题】:Is my Contact's birthday in next 10 days未来 10 天内是我的联系人的生日吗
【发布时间】:2011-08-11 22:38:57
【问题描述】:

我正在尝试计算我的通讯簿中的任何联系人在接下来的 10 天内是否有生日。网上有很多代码可以比较日期,但我只想比较日期和月份。例如,如果一个联系人出生于 1960 年 5 月 1 日(假设今天是 2011 年 4 月 24 日),那么我只想计算距离他们的生日只有六天。帮助表示赞赏。

【问题讨论】:

  • 在 SO 上完成你的 CS 作业会留下很长的论文痕迹……祝你好运。

标签: iphone sdk nsdate date nscalendar


【解决方案1】:

检索联系人的生日后:

ABAddressBook get birthday property

你需要调整年份组件:

NSDate - Changing the year value

然后,您可以计算距离她生日还有多少天:

NSDate countdown in days

【讨论】:

    【解决方案2】:

    将生日更改为今年(如果生日已经在今年,则更改为明年)并使用 NSDateComponents 和 NSCalendar 进行计算。

    看起来有点复杂,但你可以这样做:

    NSDate *birthDay = ... // [calendar dateFromComponents:myBirthDay];
    
    NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    
    NSDateComponents *thisYearComponents = [calendar components:NSYearCalendarUnit fromDate:[NSDate date]];
    NSDateComponents *birthDayComponents = [calendar components:NSMonthCalendarUnit|NSDayCalendarUnit fromDate:birthDay];
    [birthDayComponents setYear:[thisYearComponents year]];
    
    NSDate *birthDayThisYear = [calendar dateFromComponents:birthDayComponents];
    
    NSDateComponents *difference = [calendar components:NSDayCalendarUnit fromDate:[NSDate date] toDate:birthDayThisYear options:0];
    if ([difference day] < 0) {
        // this years birthday is already over. calculate distance to next years birthday
        [birthDayComponents setYear:[thisYearComponents year]+1];
        birthDayThisYear = [calendar dateFromComponents:birthDayComponents];
        difference = [calendar components:NSDayCalendarUnit fromDate:[NSDate date] toDate:birthDayThisYear options:0];
    }
    
    
    NSLog(@"%i days until birthday", [difference day]);
    

    【讨论】:

    • 太棒了!谢谢fluchtpunkt。这完美地工作。谁会想到这么简单的事情需要这么多的工作。
    • 所有与日期相关的东西都需要大量的代码,如果你想把它做好的话。这就是为什么在时区、夏令时、闰年等方面存在如此多错误的原因。 (是的,我看你有 86400 个用户。)我们很高兴我们有 NSDateComponents 和 NSCalendar,否则你可能需要 20 倍的代码。
    • 哦,顺便说一句,不要删除if ([difference day] &lt; 0) 部分,即使您认为您对明年的生日不感兴趣。实际上,您至少对一年中的前 10 天发生的生日感兴趣,至少在一年的最后 10 天。我花了一段时间才弄明白。
    【解决方案3】:

    对您的联系人NSDate 使用以下 NSDate 函数。

    - (NSTimeInterval)timeIntervalSinceNow
    

    上述函数返回接收者与当前日期时间的间隔。

       NSTimeInterval interval = [date1 timeIntervalSinceNow:myContactDate];
    

    NSTimeInterval 是以秒为单位的经过时间(表示为浮点数)。然后,您可以除以 86400,即一天中的秒数,然后四舍五入到最接近的整数。

    NSInteger days = interval / 86400;
    

    现在你有天数...

    已编辑:

    您还可以使用NSCalendarNSDateComponents 仅获取两个日期之间的日期部分。

    - (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts
    

    使用以下代码作为参考。 (Taken From Apple Documentation for NSCalendar)

    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
        NSDate *startDate = ...;
        NSDate *endDate = ...;
        unsigned int unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit;
    
        NSDateComponents *comps = [gregorian components:unitFlags fromDate:startDate  toDate:endDate  options:0];
        int months = [comps month];
        int days = [comps day];
    

    【讨论】:

      猜你喜欢
      • 2019-03-14
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 2010-11-01
      • 1970-01-01
      相关资源
      最近更新 更多