在特定的日子重复UILocalNotification

我需要设置UILocalNotification,我只需要从DatePicker中花费小时和分钟,并需要设置特定的date(如:星期一) ,并在每个星期一重复。

我有两个问题:

第一 ; 是否可以在dateselect器的date部分仅显示“星期天”这样的“date名称”?

第二个问题是, 如果我想为本地通知设置特定的date,那么正确的代码是什么?

谢谢你的答案,这里是我的代码如下;

-(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]; 

问题1 =>我不明白你想要什么。 (但是,如果你只想显示星期几,星期一,…星期六,然后使用UIPickerView。

问题2 => 是的,你可以得到正确的date的具体一天,你可以通过设置localNotification.repeatInterval = NSWeekCalendarUnit;

为了实现它,还需要使用下面的一段(方法)代码。 此方法将返回特定选定date的正确date,您只需将date作为方法的参数,

如果选定的日子是星期日,那么通过1
如果选定的一天是星期一,然后通过2



如果选定date是星期六,则通过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;

这是@ iPatel的解决scheme,也是通过dateselect器传入的时间组件的因素。 (我还更新了他的解决scheme,以使用最新的日历单位,不被弃用)。

 - (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; } 

这个解决scheme同样需要时间,但比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; } 

这里是迅捷版本:

 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 – >星期一等

Swift 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! } 
 If selected day is sunday then pass 1 If selected day is monday then pass 2 . . . If selected day is saturday then pass 7 
Interesting Posts