Ios 如何将第一个NSDate的日期和第二个NSDate的时间合成为一个NSDate?
我需要一件事: 创建一个输出NSDate,其中包括两个NSDate,格式为:yyyy-MM-dd HH:MM:00,其中yyy-MM-dd来自第一个NSDate,HH:MM:00来自第二个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 *)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实例。。。在这个过程中,您在哪里会遇到困难?