以下是我今天可以将字符串作为字符串的代码:
NSString *string;
NSDateFormatter *formatter;
string = [formatter stringFromDate: [NSDate date]];
formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat: @"yyyy-MM-dd "];
string = [formatter stringFromDate: [NSDate date]];
但是现在我想要这样我将把这个字符串作为参数,一个方法将该日期的10天之后的日期作为字符串返回。但我找不到任何解决方案。有人能帮助我吗?
答案 0 :(得分:7)
我的答案会更长一些,可能会稍微加点,但我认为最好为您提供日期管理中的概念知识,而不是“复制和粘贴”答案。 事实上日期管理即使直观也是一项非常复杂的任务。为了适当地使用Cocoa,您必须了解一些基本概念。
“日期”概念本身只是从参考日期起经过了多少秒的数字表示。这是一个绝对的衡量标准,没有什么可以改变它:如果你说现在是时间0,在10秒内它将是时间10,依此类推。它由Cocoa代表“NSDate”。
现在要将“数字日期”翻译为“日历日期”,您需要将此数字日期应用于“日历”(“NSCalendar”Cocoa类)。显然,周围有很多类型的日历,所以你要做的就是选择你想要使用的正确日历,然后将数字日期应用于它:有效结果将是“日历化日期”。请注意,相同的“数字日期”(对于所有日历而言都是通用的,因为它是绝对度量)将在不同的日历上提供不同的结果。日历就是一个复杂的算法或表格,它将每个数字日期映射到特定的“日历日期”。
创建日历日期的组件称为“日期组件”,由Cocoa类“NSDateComponents”表示。您可能已经理解,您不能直接将“日期组件”与“日期”相关联,但您需要通过“日历”来调解它们。这就是为什么所有与“Date”和“NSDateComponents”类相关的方法都在“NSCalendar”类中定义,这就解释了为什么特定的“NSDateComponents”实例与特定的“NSCalendar”实例相关联。
最后,最后一步是将“日期组件”转换为“人类可读格式”。为此,请使用“NSDateFormatter”对象。虽然将日期格式化程序链接到日期组件更合适,但为了便于从日期转换为字符串,反之亦然,NSDateFormatter方法直接使用NSDate对象而不是NSDateComponents。显然,NSDateFormatter类必须与特定日历相关联(并且要小心:它是使用默认日历初始化的。)
现在您掌握了这些信息,您可以轻松了解如何继续。您的任务是在10天后将“字符串格式”的日期转换为相同格式的日期。 所以要完成的任务是(代码如下):
1. identify the Calendar you want to use
2. create a NSDateFormatter that accepts your input string and link the Calendar to it
3. use NSDateFormatter to import the string to a "NSDate"
4. use the NSCalendar to convert the date to a NSDateComponents object
5. add 10 days to the "day" component of NSDateComponents; don't take care of "end of month" or "end of year", because NSDateComponents + NSCalendar know how to do it!
6. use NSCalendar again to convert the new recalculated NSDateComponents instance to NSDate
7. use the NSDateFormatter you defined before to convert the new NSDate to a NSString.
你可能会问:为什么我不能只用我导入的NSDate 10 * 24 * 60 * 60秒?虽然在大多数情况下此解决方案可行,但在某些情况下此操作将提供不正确的结果。例如。在夏令时开关中,您将时钟恢复1小时,即60 * 60 = 3600秒。这意味着在您的日历中,1小时的秒数将映射到两个不同的日期/时间(切换前1小时和切换后1小时)。 NSDate不知道此信息,但NSCalendar知道这些信息。你可以通过这种方式直观地看到发生了什么:想象一条无限长的线(时间线),线上的每一个“滴答”都是1秒。如果您保留现在所在的“时间点”,则此刻度将与您日历和时钟中的特定日期和时间相关联。想象一下,现在要确定这个时间线中您进行夏令时开关的点,并假设您需要在此时间之前将时钟恢复到1小时。你所做的是将时间线分成两部分,然后采用后半部分并将其第一个小时与上半部分的最后一个小时重叠。然后你会看到时间仍在继续,但是这个1小时重叠的日历将与两个给定的时间范围相关联!这是仅为您的日历+区域设置+时区所知的信息,而不仅仅是NSDate的信息(顺便说一下,我故意跳过关于“时区”和“区域设置”的任何讨论:它们是相关的,因为时区照顾将绝对时间与一天中的有效时间相关联,而语言环境可以更改某些日历规则,例如夏令时开关。
NSString *startDateStr = @"2013-02-25";
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.calendar=calendar;
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
NSDate *startDate = [dateFormatter dateFromString:startDateStr];
NSDateComponents *startComponents = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:startDate];
startComponents.day+=10;
NSDate *endDate = [calendar dateFromComponents:startComponents];
NSString *endDateStr = [dateFormatter stringFromDate:endDate];
NSLog(@"Date %@ + 10 days gives %@",startDateStr,endDateStr);
请注意,使用NSCalendar的dateByAddingComponents:toDate:options:
可以简化上述计算,但我更喜欢第一种方法,让您更好地了解类之间的交互。
答案 1 :(得分:3)
NSDate *now = [NSDate date];
NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*10];
这将在10天后返回日期。
答案 2 :(得分:1)
将fromDate字符串转换为Date类型并使用以下函数并将days参数传递为10:
NSString *fromDateString = @"Your_date_string";
// Convert string to date object
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"YOUR_DATE_FORMAT"];
NSDate *fromDate = [dateFormat dateFromString:dateStr];
[dateFormat release];
+ (NSDate *) getDate:(NSDate *)fromDate daysAhead:(NSUInteger)days
{
NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
dateComponents.day = days;
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *previousDate = [calendar dateByAddingComponents:dateComponents
toDate:fromDate
options:0];
[dateComponents release];
return previousDate;
}
答案 3 :(得分:-1)
日期后10天的代码::
NSDateFormatter *entryDateFormat;
entryDateFormat = [[NSDateFormatter alloc]init];
[entryDateFormat setDateFormat:@"dd-MM-yyyy HH:mm:ss"];
NSString *s = [NSString stringWithFormat:@"%@", [entryDateFormat stringFromDate:[[NSDate date] dateByAddingTimeInterval:60*60*24*10]]];
NSLog(@" --> %@", s);