Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何将第一个NSDate的日期和第二个NSDate的时间合成为一个NSDate?_Ios_Swift_Nsdate - Fatal编程技术网

Ios 如何将第一个NSDate的日期和第二个NSDate的时间合成为一个NSDate?

Ios 如何将第一个NSDate的日期和第二个NSDate的时间合成为一个NSDate?,ios,swift,nsdate,Ios,Swift,Nsdate,我需要一件事: 创建一个输出NSDate,其中包括两个NSDate,格式为:yyyy-MM-dd HH:MM:00,其中yyy-MM-dd来自第一个NSDate,HH:MM:00来自第二个NSDate 使用此代码 + (NSDate *)combineDate:(NSDate *)date withTime:(NSDate *)time { NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NS

我需要一件事:

创建一个输出NSDate,其中包括两个NSDate,格式为:yyyy-MM-dd HH:MM:00,其中yyy-MM-dd来自第一个NSDate,HH:MM:00来自第二个NSDate 使用此代码

+ (NSDate *)combineDate:(NSDate *)date withTime:(NSDate *)time 
{
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

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

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

    NSDate *combDate = [gregorian dateFromComponents:dateComponents];   

    return combDate;
}

如果您有两个字符串,可能会对您有所帮助:

NSDateFormatter *dateformate=[[NSDateFormatter alloc]init];
[dateformate setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSString *outputDate = [dateformate dateFromString:[@"2015-09-01" stringByAppendingString:@"08:33:00"]];

您可以通过创建一个方便的初始值设定项轻松实现这一点,如下所示:

convenience init(date: NSDate?, time: NSDate?) {
    var combinedDate = NSDate()

    if let date = date {
        if let time = time {
            let calendar = NSCalendar.currentCalendar()
            let timeComponents = calendar.components(.HourCalendarUnit | .MinuteCalendarUnit | .TimeZoneCalendarUnit, fromDate: time)
            var dateComponents = calendar.components(.YearCalendarUnit | .MonthCalendarUnit | .DayCalendarUnit, fromDate: date)
            dateComponents.hour = timeComponents.hour
            dateComponents.minute = timeComponents.minute
            dateComponents.second = 0
            dateComponents.timeZone = timeComponents.timeZone

            if let dateFromComponents = calendar.dateFromComponents(dateComponents) {
                combinedDate = dateFromComponents
            }
        }
    }

    self.init(timeInterval:0, sinceDate: combinedDate)
}
基本上,它由两个日期的组件组成一个日期。例如,从第二个NSDate(称为时间)开始,需要时、分、秒;从第一个NSDate(称为日期)开始,需要年、月、日

可以修改零部件,使其更精确或更不精确。您甚至可以扩展Initializer以包含日历的自定义单位。

Swift 5版本:

    init?(date: Date, time: Date) {
    let calendar = Calendar.current
    let timeComponents = calendar.dateComponents([.hour, .minute, .timeZone], from: time)
    var dateComponents = calendar.dateComponents([.year, .month, .day], from: date)
    dateComponents.hour = timeComponents.hour
    dateComponents.minute = timeComponents.minute
    dateComponents.second = 0
    dateComponents.timeZone = timeComponents.timeZone

    guard let combined = calendar.date(from: dateComponents) else { return nil }
    self = combined
}

你试过什么吗?你是如何得到这两种数据的?你写了两种输出格式。你不会写任何关于两次约会的东西。有一个不同点。日期是否同时具有两个字符串?如果是NSDate,则NSDate组件可能是一种方式,如果是NSString,则为附加字符串,然后使用NSDateFormatter。我有两个按钮,一个用于日期,一个用于时间。当我点击其中一个按钮时,我有一个弹出窗口,并根据按钮类型选择时间或日期。然后组合成一个字符串,并使用NSDateFormatter从该字符串获取NSDate实例。。。在这个过程中,您在哪里会遇到困难?