1

我有一个包含出生日期的数组,如下所示:

 Array(
"11/07/2013",
"07/10/2013",
"20/02/2013"
)

现在我想根据日期是否已过创建一个新数组。在 2013 年写这个问题,如果当前日期已经过去,那么我们将该日期的年份更改为 2014 年。如果还没有过去,那么我们将保持 2013 年的日期。

例如:

NewArray(
 "11/07/2013",    no change cus this date hasnt passed yet
 "07/10/2013",     no change same as above
 "20/02/2014"     **as date has already passed thats why 2014**

我为此使用以下代码

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
   [dateFormatter setDateFormat:@"dd/MM/yyyy"];
NSString *curYear = [dateFormatter stringFromDate:[NSDate date]];
NSString *nextYear = [NSString stringWithFormat: @"%d", ([curYear intValue] + 1)];
for(int i = 0; i < [_newlymadeArray count]; i++)
{
    NSString *dateStr = [_newlymadeArray objectAtIndex:i];
    NSComparisonResult comResult = [[dateFormatter dateFromString:dateStr] compare:    [NSDate date]];
    if(comResult == NSOrderedAscending)
    {
        [dateStr stringByReplacingOccurrencesOfString:curYear withString:nextYear];
        [_newlymadeArray replaceObjectAtIndex:i withObject:dateStr];
         NSLog(@"_newlymadeArray%@",_newlymadeArray);
    }
NSLog(@"_newlymadeArray%@",_newlymadeArray);

然而,这是我在 NSLog 时得到的_newlymadeArray

 after replacing (
 "11/07/2013",
 "07/10/2013",
 "20/02/2013"       
 )

在索引 2处,它应该是“20/02/2014”而不是 2013 年的日期。什么可能导致我的问题,我该如何解决?

4

4 回答 4

2

我对您的代码进行了一些修改,它可以按您的意愿工作。

在我的代码中,我比较了日期,它是当前日期的升序形式。如果它满足条件,那么我已经通过 DateFormatter“yyyy”从匹配的日期获取 YEAR。然后我简单地将今年增加 1,并将今年替换为旧日期,即“20/02/ 2013 ”​​到“ 20/02/2014

array = [[NSMutableArray alloc] initWithObjects:@"11/07/2013",@"07/10/2013",@"20/02/2013", nil];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd/MM/yyyy"];
for(int i = 0; i < [array count]; i++)
{
    NSString *dateStr = [array objectAtIndex:i];
    NSComparisonResult comResult = [[dateFormatter dateFromString:dateStr] compare:    [NSDate date]];
    if(comResult == NSOrderedAscending)
    {
        NSDateFormatter *yrFormatter = [[NSDateFormatter alloc] init];
        [yrFormatter setDateFormat:@"yyyy"];
        NSString *curYear = [yrFormatter stringFromDate:[NSDate date]];
        NSString *nextYear = [NSString stringWithFormat: @"%d", ([curYear intValue] + 1)];

        NSLog(@"%@",curYear);
        NSLog(@"%@",nextYear);

        dateStr = [dateStr stringByReplacingOccurrencesOfString:curYear withString:nextYear];
        NSLog(@"%@",dateStr);
        [array replaceObjectAtIndex:i withObject:dateStr];
        NSLog(@"_newlymadeArray%@",array);
    }
    NSLog(@"_newlymadeArray%@",array);
}

这似乎工作得很好,所以我希望它可以帮助你。

于 2013-03-13T12:01:55.893 回答
1

请亲爱的尝试使用这个。我认为这个可能会有所帮助

 NSCalendar*       calendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
    NSDateComponents* components = [[NSDateComponents alloc] init];
    components.year = 1;
    NSDate* newDate = [calendar dateByAddingComponents: components toDate:@"YourDate" options: 0];

否则,您可以使用此代码。

   if (comResult == NSOrderedSame)
   {
       NSCalendar*       calendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
    NSDateComponents* components = [[NSDateComponents alloc] init];
    components.year = 1;

    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    [formatter setDateFormat:@"dd/MM/yyyy"];

    NSDate *date = [formatter dateFromString:@"11/07/2013"];

    NSDate* newDate = [calendar dateByAddingComponents: components toDate:date options: 0];
   // here replace your array object with this "newDate"

   }
于 2013-03-13T11:53:41.780 回答
0

使用函数将您的数组日期与今天的日期进行比较NSDate compare。以下是详细信息:

NSString *arrayDateString = @"20/02/2013" // fetch this string from your array
NSDate *todaysDate = [NSDate date];

NSDateFormatter* df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"dd/MM/yyyy"];
NSDate* d = [df dateFromString:arrayDateString];

// now compare this date (d) with todaysDate using NSDate function
if ([d compare:todaysdate]== NSOrderedAscending)  
{//write your code here}

如果结果NSOrderedAscending为 ,则表示数组日期早于今天的日期。

因此,对于该日期,使用以下方法更新年份加一NSDateComponents

NSDateComponents *dayComponent = [[[NSDateComponents alloc] init] autorelease];
dayComponent.year = 1;

NSCalendar *theCalendar = [NSCalendar currentCalendar];
dateToBeIncremented = [theCalendar dateByAddingComponents:dayComponent toDate:dateToBeIncremented options:0];

或者您可以使用NSDate函数本身:

NSDate *now = arrayDate;
int yearsToAdd = 1;
NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*365*year];

但第二个选项不是完全证明 - 因为闰年问题。

希望这两个选项对您有所帮助,以解决您的问题。

于 2013-03-13T11:54:46.330 回答
0
NSArray * array = [[NSArray alloc]   initWithObjects:@"11/07/2013",@"07/10/2013",@"20/02/2013", nil];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd/MM/yyyy"];
NSDate *now = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
NSMutableArray *output = [NSMutableArray new];

for(int i = 0; i < [array count]; i++)
{
    NSString *dateStr = [array objectAtIndex:i];
    NSDate *date = [dateFormatter dateFromString:dateStr];
    if ([date compare:now] == NSOrderedAscending)
    {

        [components setYear:1];
        date = [calendar dateByAddingComponents:components toDate:date options:0];

    }
    dateStr = [dateFormatter stringFromDate:date];
    [output addObject:dateStr];

}
NSLog(@"Result : %@",output);
于 2013-03-13T12:19:18.313 回答