如何将两个UIDatePicker的日期和时间合并?

16

我的应用程序中有两个 UIDatePicker,一个模式用于选择日期,另一个模式用于选择时间。当到达确切的日期和时间时,我已经触发了一个通知。我能够在正确的时间触发提醒,但问题是日期没有被检查。是否有一种同时检查日期和时间的方法?

谢谢提前...

编辑

NSDate *date1 = [datePicker date];
NSDate *date2 = [timePicker date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

unsigned unitFlagsDate = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
NSDateComponents *dateComponents = [gregorian components:unitFlagsDate fromDate:date1];
unsigned unitFlagsTime = NSHourCalendarUnit | NSMinuteCalendarUnit ;
NSDateComponents *timeComponents = [gregorian components:unitFlagsTime fromDate:date2];

[dateComponents setHour:[timeComponents hour]];
[dateComponents setMinute:[timeComponents minute]];

NSDate *combDate = [gregorian dateFromComponents:dateComponents];   

UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif == nil) return;
NSDate *fireTime = combDate;
localNotif.fireDate = fireTime;
localNotif.alertBody = @"Alert!";
localNotif.soundName = UILocalNotificationDefaultSoundName;  
[[UIApplication sharedApplication] scheduleLocalNotification:localNotif];

@CRDave:我尝试了很多方法,但是我一直得到的组合日期是2001-01-01之类的。并且通知会在保存时出现。 - Midas
请将当前代码的某些行放在日期和时间格式中,例如NSString或NSDate,并说明如何组合。我希望这能帮助有需要的人回答您的问题。 - CRDave
@CRDave 我想你读错了,它并不是在比较,而是在合并日期和时间。 - Midas
你是否连接了你的 IBOutlets? 因为我复制了你的代码,执行 setHour 和 setMinute 后,在 dateComponents 中我得到了正确的日期和时间。 - rdelmar
显示剩余5条评论
3个回答

23
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *dateComponents = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:self.datePicker.date];
NSDateComponents *timeComponents = [calendar components:NSHourCalendarUnit|NSMinuteCalendarUnit fromDate:self.timePicker.date];

NSDateComponents *newComponents = [[NSDateComponents alloc]init];
newComponents.timeZone = [NSTimeZone systemTimeZone];
[newComponents setDay:[dateComponents day]];
[newComponents setMonth:[dateComponents month]];
[newComponents setYear:[dateComponents year]];
[newComponents setHour:[timeComponents hour]];
[newComponents setMinute:[timeComponents minute]];

NSDate *combDate = [calendar dateFromComponents:newComponents]; 

NSLog(@" \ndate : %@ \ntime : %@\ncomDate : %@",self.datePicker.date,self.timePicker.date,combDate);

已弃用 - 8.0 NSCalendarUnitYear,NSCalendarUnitMonth,NSCalendarUnitDay NSCalendarUnitHour,NSCalendarUnitMinute,NSCalendarUnitSecond - Alex Hedley

5

如果有帮助,以下是已接受答案的 Swift 5 版本。

/// Returns `Date` from date and time.
func combine(date: Date, time: Date) -> Date? {
    let calendar = Calendar.current
    let dateComponents = calendar.dateComponents([.day, .month, .year], from: date)
    let timeComponents = calendar.dateComponents([.hour, .minute, .second], from: time)
    
    var newComponents = DateComponents()
    newComponents.timeZone = .current
    newComponents.day = dateComponents.day
    newComponents.month = dateComponents.month
    newComponents.year = dateComponents.year
    newComponents.hour = timeComponents.hour
    newComponents.minute = timeComponents.minute
    newComponents.second = timeComponents.second
    
    return calendar.date(from: newComponents)
}

2

尝试这个:

将日期转换为NSString,将时间转换为NSString。

将时间附加到日期字符串中。

现在将最终字符串转换为NSDate。

例子:(从你的一侧添加验证)

 NSDate *date1 = [datePicker date];
    NSDate *date2 = [timePicker date];

    NSString *date = [NSString stringWithFormat:@"%@",date1];
    NSString *time = [NSString stringWithFormat:@"%@",date2];

    NSString *dateAndTime = [NSString stringWithFormat:@"%@ %@",date,time];
    NSDate *dateTime = [self dateFromString:dateAndTime];



- (NSDate*) dateFromString:(NSString*)aStr
{


    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
    //[dateFormatter setDateFormat:@"YYYY-MM-dd HH:mm:ss a"];
    [dateFormatter setDateFormat:@"MM/dd/yyyy HH:mm:ss a"];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

    NSLog(@"%@", aStr);
    NSDate   *aDate = [dateFormatter dateFromString:aStr];
    [dateFormatter release];
    return aDate;
}

经过许多努力,上述逻辑对我来说运行良好。 - codeIgnitor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接