iOS:日期组件查询

时间:2012-01-23 02:53:04

标签: iphone ios xcode ipad notifications

我想知道如何编辑dateComps setDay:以便在选择器中设置的日期前3天关闭。我键入-3,但似乎并没有这样做。 任何帮助深表感谢!这是我的代码:

- (IBAction)scheduleNotifButton:(id)sender {
    NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];

    NSDate *pickerDate = [self.datePicker date];

    NSDateComponents *dateComponents = [calendar components:( NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit )
                                                   fromDate:pickerDate];
    NSDateComponents *timeComponents = [calendar components:( NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit )
                                                   fromDate:pickerDate];

    NSDateComponents *dateComps = [[NSDateComponents alloc] init];
    [dateComps setDay:[dateComponents day]];
    [dateComps setMonth:[dateComponents month]];
    [dateComps setYear:[dateComponents year]];
    [dateComps setHour:13];
    [dateComps setMinute:30];
    [dateComps setSecond:[timeComponents second]];
    NSDate *itemDate = [calendar dateFromComponents:dateComps];

    UILocalNotification *localNotif = [[UILocalNotification alloc] init];
    if (localNotif == nil)
        return;
    localNotif.fireDate = itemDate;
    localNotif.timeZone = [NSTimeZone defaultTimeZone];

    localNotif.alertBody = @"Event is in 3 days!";
    localNotif.alertAction = nil;

    localNotif.soundName = UILocalNotificationDefaultSoundName;
    localNotif.applicationIconBadgeNumber = 0;

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];

}

4 个答案:

答案 0 :(得分:2)

当你说你输入了-3时,你的意思是你用过这条线吗?

[dateComps setDay:[dateComponents day] - 3];

这实际上应该有用。

此外,您可以通过将当前年份设置为日期组件来告诉系统明年开火。您可以按照找到pickerDate的日期组件的方式找到当前年份。

之后,您可以将本地通知的repeatInterval设置为NSYearCalendarUnit,这样每年都会触发。

答案 1 :(得分:2)

我认为您需要做的就是从日期选择器返回的日期开始减去3天,不是吗?

NSDate *pickerDate = [self.datePicker date]
pickerDate = [ pickerDate dateByAddingTimeInterval:-3 * 24 * 60 * 60 ] ; // add this line

使用日期组件的版本:

- (IBAction)scheduleNotifButton:(id)sender {
    NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];

    NSDate *pickerDate = [self.datePicker date];

    {
        NSDateComponent * deltaComponents = [ [ NSDateComponents alloc ] init ];
        deltaComponents.days = -3 ;

        pickerDate = [ pickerDate dateByAddingComponents:deltaComponents ] ;
    }

    NSDateComponents *dateComponents = [calendar components:( NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit ) fromDate:pickerDate];

    [dateComps setHour:13];
    [dateComps setMinute:30];

    NSDate *itemDate = [calendar dateFromComponents:dateComps];

    UILocalNotification *localNotif = [[UILocalNotification alloc] init];
    if (localNotif == nil)
        return;
    localNotif.fireDate = itemDate;
    localNotif.timeZone = [NSTimeZone defaultTimeZone];

    localNotif.alertBody = @"Event is in 3 days!";
    localNotif.alertAction = nil;

    localNotif.soundName = UILocalNotificationDefaultSoundName;
    localNotif.applicationIconBadgeNumber = 0;

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];

}

答案 2 :(得分:1)

这是从今天(现在)减去3天的代码。您可以根据自己的需要进行调整:

   NSDate *today = [NSDate date];
    NSLog(@"NOW:%@",today);
    NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *todayComps = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit |NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:today];
     todayComps.day -=3;
    NSDate *dateMinus3Days = [gregorian dateFromComponents:todayComps];
    NSLog(@"3 days before NOW:%@",dateMinus3Days);

你做得太复杂了。可以修改DateComponents,然后将其设置为新日期。

答案 3 :(得分:1)

使用dateByAddingComponents:toDate:options:

// ...
NSDateComponents *offset = [NSDateComponents new];
[offset setDay:(-3)];
NSDate *date3DaysBefore = [calendar dateByAddingComponents:offset toDate:pickerDate options:0];
// ...