首页 文章

在特定日期重复UILocalNotification

提问于
浏览
6

我需要设置UILocalNotification,我只需要从DatePicker获取小时和分钟,并需要设置特定日期(如:星期一)并在每个星期一重复 .

我有两个问题:

第一 ;是否可以在日期选择器的日期部分仅显示“日期名称”,如“星期日”?

第二个问题是;如果我想设置本地通知的具体日期,那么正确的代码是什么?

谢谢你的答案,下面是我的代码;

-(IBAction) alarmButton:(id)sender {

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
dateFormatter.timeZone = [NSTimeZone defaultTimeZone];
dateFormatter.timeStyle = NSDateFormatterShortStyle;
dateFormatter.dateStyle = NSDateFormatterShortStyle;

NSString *dateTimeString = [dateFormatter stringFromDate: dateTimePickerSet1.date];
NSLog ( @"Alarm Set :%@" , dateTimeString);

[self scheduleLocalNotificationWithDate1: dateTimePickerSet1.date];

}

-(void)scheduleLocalNotificationWithDate1:(NSDate *)fireDate {
UILocalNotification *notification = [[UILocalNotification alloc] init];

notification.fireDate = fireDate;
notification.alertBody = @"Alarm Set !";

[[UIApplication sharedApplication] scheduleLocalNotification:notification];

5 回答

  • 8

    Question 1 => 我无法理解你想要什么 . (但是如果你只想显示像 sunday, monday,....to saturday 这样的天的名字,那就用UIPickerView.

    Question 2 => YES 您可以获得特定日期的正确日期,您可以通过设置 localNotification.repeatInterval = NSWeekCalendarUnit; 获取每个特定日期的通知

    为了实现它,还需要使用下面的(方法)代码 . 此方法将返回特定选定日期的正确日期,您只需要传递 day 作为方法的参数,如,

    如果选定日是星期日,则通过1如果选择日是星期一,则通过2 . . . 如果选定的一天是星期六,那么通过7

    这是方法代码:

    -(NSDate *) getDateOfSpecificDay:(NSInteger ) day /// here day will be 1 or 2.. or 7
    {
      NSInteger desiredWeekday = day
      NSRange weekDateRange = [[NSCalendar currentCalendar] maximumRangeOfUnit:NSWeekdayCalendarUnit];
      NSInteger daysInWeek = weekDateRange.length - weekDateRange.location + 1;
    
      NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSWeekdayCalendarUnit fromDate:[NSDate date]];
      NSInteger currentWeekday = dateComponents.weekday;
      NSInteger differenceDays = (desiredWeekday - currentWeekday + daysInWeek) % daysInWeek;
      NSDateComponents *daysComponents = [[NSDateComponents alloc] init];
      daysComponents.day = differenceDays;
      NSDate *resultDate = [[NSCalendar currentCalendar] dateByAddingComponents:daysComponents toDate:[NSDate date] options:0];
      return resultDate;
    }
    

    别忘了设置 localNotification.repeatInterval = NSWeekCalendarUnit;

  • 0

    这是@ iPatel的解决方案,它也会影响通过datepicker传入的时间组件 . (我还更新了他的解决方案,以使用未弃用的最新日历单元) .

    - (NSDate *) getFireDateForDayOfWeek:(NSInteger)desiredWeekday withTime:(NSDate *)time // 1:Sunday - 7:Saturday
    {
        NSRange weekDateRange = [[NSCalendar currentCalendar] maximumRangeOfUnit:NSCalendarUnitWeekday];
        NSInteger daysInWeek = weekDateRange.length - weekDateRange.location + 1;
    
        NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSCalendarUnitWeekday fromDate:[NSDate date]];
        NSInteger currentWeekday = dateComponents.weekday;
        NSInteger differenceDays = (desiredWeekday - currentWeekday + daysInWeek) % daysInWeek;
    
        NSDateComponents *daysComponents = [[NSDateComponents alloc] init];
        daysComponents.day = differenceDays;
        NSDate *fireDate = [[NSCalendar currentCalendar] dateByAddingComponents:daysComponents toDate:[NSDate date] options:0];
    
        NSDateComponents *timeComponents = [[NSCalendar currentCalendar] components:     NSCalendarUnitHour | NSCalendarUnitMinute fromDate:time];
        NSDateComponents *fireDateComponents = [[NSCalendar currentCalendar]
                    components: NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond
                    fromDate:fireDate];
    
        fireDateComponents.hour = timeComponents.hour;
        fireDateComponents.minute = timeComponents.minute;
        fireDateComponents.second = 0;
    
        NSDate *resultDate = [[NSCalendar currentCalendar] dateFromComponents:fireDateComponents];
    
        // The day could be today but time is in past. If so, move ahead to next week
        if(resultDate.timeIntervalSinceNow < 0) {
            resultDate = [resultDate dateByAddingTimeInterval:60 * 60 * 24 * 7];
        }
    
        return resultDate;
    }
    
  • 0

    这个解决方案也需要时间,但它比Oren的简化得多

    -(NSDate *) dateOfSpecificDay:(NSInteger ) day withFireTime:(NSDate *)timeDate/// here day will be 1 or 2.. or 7 and timeDate the current day with the desired time 
    {
        NSInteger desiredWeekday = day;
        NSRange weekDateRange = [[NSCalendar currentCalendar] maximumRangeOfUnit:NSCalendarUnitWeekday];
        NSInteger daysInWeek = weekDateRange.length - weekDateRange.location + 1;
    
        NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSCalendarUnitWeekday fromDate:[NSDate date]];
        NSInteger currentWeekday = dateComponents.weekday;
        NSInteger differenceDays = (desiredWeekday - currentWeekday + daysInWeek) % daysInWeek;
        if (differenceDays == 0) {
            //Check if should register for same day or for next week
            if ([timeDate compare:[NSDate date]] == NSOrderedAscending) {
                //Should schedule for next week
                differenceDays = daysInWeek;
            }
        }
    
        NSDateComponents *daysComponents = [[NSDateComponents alloc] init];
        daysComponents.day = differenceDays;
        NSDate *resultDate = [[NSCalendar currentCalendar] dateByAddingComponents:daysComponents toDate:timeDate options:0];
    
        return resultDate;
    }
    
  • 0

    这是 swift 版本:

    func calculateTheNExtFriday(inputTime: NSDate) -> NSDate {
        let desiredWeekday = 6 // Friday
    
        let weekDateRange = NSCalendar.currentCalendar().maximumRangeOfUnit(NSCalendarUnit.Weekday)
        let daysInWeek = weekDateRange.length - weekDateRange.location + 1;
    
        let currentWeekday = NSCalendar.currentCalendar().components(NSCalendarUnit.Weekday, fromDate: inputTime).weekday
        let differenceDays = (desiredWeekday - currentWeekday + daysInWeek) % daysInWeek
    
        let dateComponents = NSDateComponents()
        dateComponents.day = differenceDays
    
        let calculatedFridayDate = NSCalendar.currentCalendar().dateByAddingComponents(dateComponents, toDate: inputTime, options: NSCalendarOptions.init(rawValue: 0))
        return calculatedFridayDate!
    }
    

    在这个例子中,我在函数内部使用了desiredWeekday,但你也可以使用它作为参数 .

    注意:请记住,第1天对应于星期日,2 - >星期一,依此类推

  • 0

    斯威夫特3:

    func calculateSpecificDay(_ desiredWeekday: NSInteger, fromDate: Date = Date()) -> Date {
    
        let weekDateRange = NSCalendar.current.maximumRange(of: .weekday)!
        let daysInWeek = weekDateRange.lowerBound.distance(to: weekDateRange.upperBound) - weekDateRange.lowerBound + 1
    
        let currentWeekday = NSCalendar.current.dateComponents([.weekday], from: fromDate).weekday
        let differenceDays = (desiredWeekday - currentWeekday! + daysInWeek) % daysInWeek
    
        var dateComponents = DateComponents()
        dateComponents.day = differenceDays
    
        let calculatedFridayDate = NSCalendar.current.date(byAdding: dateComponents, to: fromDate)
        return calculatedFridayDate!
    }
    

    如果选定日是星期日,则通过1
    如果选择的日期是星期一,那么通过2
    .
    .
    .
    如果选定的一天是星期六,那么通过7

相关问题