【问题标题】:find total number of days between two dates in iphone在iphone中查找两个日期之间的总天数
【发布时间】:2011-08-29 11:52:36
【问题描述】:

我想找出两个日期之间的总天数。

例如今天是 01-01-2011(DD-MM-YYYY),第二个日期是 (25-03-2011),我怎样才能找到总天数?

NSDate *currentdate=[NSDate date];
NSLog(@"curretdate is ==%@",currentdate);
NSDateFormatter *tempFormatter1 = [[[NSDateFormatter alloc]init]autorelease];
[tempFormatter1 setDateFormat:@"dd-mm-YYYY hh:mm:ss"];
NSDate *toDate = [tempFormatter1 dateFromString:@"20-04-2011 09:00:00"];

NSLog(@"toDate ==%@",toDate);

【问题讨论】:

标签: ios nsdate nsdateformatter


【解决方案1】:

在您设置错误的日期格式中,它是 dd-MM-yyyy HH:mm:ss 。可能这就是问题所在..你得到错误的日期并且没有得到答案我发送litte bit code来获取日差。

  NSDateFormatter *tempFormatter = [[[NSDateFormatter alloc]init]autorelease];
 [tempFormatter setDateFormat:@"dd-MM-yyyy HH:mm:ss"];
  NSDate *startdate = [tempFormatter dateFromString:@"15-01-2011 09:00:00"];
  NSLog(@"startdate ==%@",startdate);

  NSDateFormatter *tempFormatter1 = [[[NSDateFormatter alloc]init]autorelease];
  [tempFormatter1 setDateFormat:@"dd-MM-yyyy HH:mm:ss"];
  NSDate *toDate = [tempFormatter1 dateFromString:@"20-01-2011 09:00:00"];
  NSLog(@"toDate ==%@",toDate);

   int i = [startdate timeIntervalSince1970];
   int j = [toDate timeIntervalSince1970];

   double X = j-i;

   int days=(int)((double)X/(3600.0*24.00));
   NSLog(@"Total Days Between::%d",days);

编辑 1:

我们可以使用以下函数找到日期差异:

-(int)dateDiffrenceFromDate:(NSString *)date1 second:(NSString *)date2 {
    // Manage Date Formation same for both dates
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"dd-MM-yyyy"];
    NSDate *startDate = [formatter dateFromString:date1];
    NSDate *endDate = [formatter dateFromString:date2];


    unsigned flags = NSDayCalendarUnit;
    NSDateComponents *difference = [[NSCalendar currentCalendar] components:flags fromDate:startDate toDate:endDate options:0];

    int dayDiff = [difference day];

    return dayDiff;
}

来自 Abizern 的回答。查找更多关于 NSDateComponent 的信息here.

【讨论】:

  • 小心,这不考虑小时班次。例如,如果差异是例如1.6 天,它可能会返回 1 天而不是 2 天,在特殊情况下这可能会更糟,因为两个日期之间有 DST 切换。更喜欢使用 NSDateComponents 来检索日期组件,如日、月、年等。
  • 好的,但是你可以很容易地理解这个简单的逻辑。任何人在得到想法后都会编写代码
  • @AJPatel 我如何从日期获取记录。示例:2016 年 12 月 9 日 23:59:59 之间的 12-09-2016 00:00:00
  • @KrutarthPatel 在您的收藏中使用谓词过滤器。像 "@"dateField > %@ AND dateField
【解决方案2】:
NSCalendar *Calander = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
NSDateComponents *comps = [[NSDateComponents alloc] init];

[dateFormat setDateFormat:@"dd"];
[comps setDay:[[dateFormat stringFromDate:[NSDate date]] intValue]];
[dateFormat setDateFormat:@"MM"];
[comps setMonth:[[dateFormat stringFromDate:[NSDate date]] intValue]];
[dateFormat setDateFormat:@"yyyy"];
[comps setYear:[[dateFormat stringFromDate:[NSDate date]] intValue]];
[dateFormat setDateFormat:@"HH"];
[comps setHour:05];
[dateFormat setDateFormat:@"mm"];
[comps setMinute:30];

NSDate *currentDate=[Calander dateFromComponents:comps];

NSLog(@"Current Date is :- '%@'",currentDate);


[dateFormat setDateFormat:@"dd"];
[comps setDay:[[dateFormat stringFromDate:yourDate] intValue]];
[dateFormat setDateFormat:@"MM"];
[comps setMonth:[[dateFormat stringFromDate:yourDate] intValue]];
[dateFormat setDateFormat:@"yyyy"];
[comps setYear:[[dateFormat stringFromDate:yourDate] intValue]];
[dateFormat setDateFormat:@"HH"];
[comps setHour:05];
[dateFormat setDateFormat:@"mm"];
[comps setMinute:30];

NSDate *reminderDate=[Calander dateFromComponents:comps];

    //NSLog(@"Current Date is :- '%@'",reminderDate);

    //NSLog(@"Current Date is :- '%@'",currentDate);

    NSTimeInterval ti = [reminderDate timeIntervalSinceDate:currentDate];

    //NSLog(@"Time Interval is :- '%f'",ti);
    int days = ti/86400;

[dateFormat release];
[Calander release];
[comps release];

希望它对你有用........

【讨论】:

  • 对不起,但我无法理解 yourDate,我尝试了另一个日期,它会给我 -145 天的差异,那不是真的
【解决方案3】:

一个更简单的方法是:

// This just sets up the two dates you want to compare
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"dd-MM-yyyy"];
NSDate *startDate = [formatter dateFromString:@"01-01-2011"];
NSDate *endDate = [formatter dateFromString:@"25-03-2011"];

// This performs the difference calculation
unsigned flags = NSDayCalendarUnit;
NSDateComponents *difference = [[NSCalendar currentCalendar] components:flags fromDate:startDate toDate:endDate options:0];

// This just logs your output
NSLog(@"Start Date, %@", startDate);
NSLog(@"End Date, %@", endDate);
NSLog(@"%ld", [difference day]);

结果是:

开始日期,2011-01-01 00:00:00 +0000

结束日期,2011-03-25 00:00:00 +0000

83

尝试使用和操纵秒来计算时差是一个坏主意。 Cocoa 提供了大量用于日历计算的类和方法,您应该尽可能多地使用它们。

【讨论】:

    【解决方案4】:

    试试这个

    - (int) daysToDate:(NSDate*) endDate
    {
        //dates needed to be reset to represent only yyyy-mm-dd to get correct number of days between two days.
        NSDateFormatter *temp = [[NSDateFormatter alloc] init];
        [temp setDateFormat:@"yyyy-MM-dd"];
        NSDate *stDt = [temp dateFromString:[temp stringFromDate:self]];
        NSDate *endDt =  [temp dateFromString:[temp stringFromDate:endDate]];
        [temp release]; 
        unsigned int unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit;
        NSCalendar *gregorian = [[NSCalendar alloc]
                                 initWithCalendarIdentifier:NSGregorianCalendar];
        NSDateComponents *comps = [gregorian components:unitFlags fromDate:stDt  toDate:endDt  options:0];
        int days = [comps day];
        [gregorian release];
        return days;
    }
    

    【讨论】:

    • 在使用精确计时时,我收到了错误的时间日历日差。这是正确的解决方案!太好了!
    • 感谢 nfrik。你能帮我做点别的吗?
    • 您可能应该指出这是从 Joshua Weinberg 的回答中复制的:stackoverflow.com/a/3142380/19679
    【解决方案5】:

    //试试看

    if((![txtFromDate.text isEqualToString:@""]) && (![txtToDate.text isEqualToString:@""]))
        {
            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
            [formatter setDateFormat:@"MM/dd/yyyy"];
            NSDate *startDate = [formatter dateFromString:txtFromDate.text];
            NSDate *endDate = [formatter dateFromString:txtToDate.text];
            unsigned flags = NSDayCalendarUnit;
            NSDateComponents *difference = [[NSCalendar currentCalendar] components:flags fromDate:startDate toDate:endDate options:0];
    
            int dayDiff = [difference day];
    
            lblNoOfDays.text =[NSString stringWithFormat:@"%d",dayDiff];
        }
    

    【讨论】:

      【解决方案6】:

      查找开始日期到结束日期之间的日期数。

       NSCalendar *cale=[[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
          unsigned unitFlags=NSMonthCalendarUnit| NSDayCalendarUnit;
          NSDateComponents *comp1=[cale components:unitFlags fromDate:startDate toDate:endDate options:0];
      
          NSInteger days=[comp1 day];
          NSLog(@"Days %ld",(long)days);
      

      【讨论】:

        【解决方案7】:
        NSDate *dateA;
        NSDate *dateB;
        
        NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
        NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit
                                                   fromDate:dateA
                                                     toDate:dateB
                                                    options:0];
        
        NSLog(@"Difference in date components: %i/%i/%i", components.day, components.month, components.year);
        

        【讨论】:

          【解决方案8】:
          //write this code in .h file
          {
              NSDate *startDate,*EndDate;
              NSDateFormatter *Date_Formatter;
          }
          //write this code in .h file`enter code here`
          - (void)viewDidLoad
          {
              [super viewDidLoad];
              Date_Formatter =[[NSDateFormatter alloc]init];
              [Date_Formatter setDateFormat:@"dd-MM-yyyy"];
          
              UIToolbar *numbertoolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
              numbertoolbar.barStyle = UIBarStyleBlackTranslucent;
              numbertoolbar.items = [NSArray arrayWithObjects:[[UIBarButtonItem alloc]initWithTitle:@"Next"
              style:UIBarButtonItemStyleDone target:self action:@selector(doneWithNumberPad)],nil];
              [numbertoolbar sizeToFit];
          
              Txt_Start_Date.inputAccessoryView = numbertoolbar;
              [Txt_Start_Date setInputView:Picker_Date];
              Txt_End_Date.inputAccessoryView = numbertoolbar;
              [Txt_End_Date setInputView:Picker_Date];
              [Picker_Date addTarget:self action:@selector(updateTextfield:) forControlEvents:UIControlEventValueChanged];
              // Do any additional setup after loading the view, typically from a nib.
          }
          -(void)doneWithNumberPad
          {
          
              if ([Txt_Start_Date isFirstResponder])
              {
                  [Txt_Start_Date resignFirstResponder];
                  [Txt_End_Date becomeFirstResponder];
              }
              else if([Txt_End_Date isFirstResponder])
              {
                  [Txt_End_Date resignFirstResponder];
          
                  startDate =[Date_Formatter dateFromString:Txt_Start_Date.text];
                  EndDate =[Date_Formatter dateFromString:Txt_End_Date.text];
                  NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
                  NSDateComponents *components = [calendar components:NSDayCalendarUnit fromDate:startDate toDate:EndDate options:0];
                  Lab_Total_Days.text =[NSString stringWithFormat:@"%ld",components.day];
              }
          
          }
          

          【讨论】:

            【解决方案9】:

            请试试这个。希望对你有帮助...

            NSDateFormatter *df=[[NSDateFormatter alloc] init];
            // Set the date format according to your needs
            [df setDateFormat:@"MM/dd/YYYY hh:mm a"]; //for 12 hour format
            //[df setDateFormat:@"MM/dd/YYYY HH:mm "]  // for 24 hour format
            NSDate *date1 = [df dateFromString:firstDateString];
            NSDate *date2 = [df dateFromString:secondDatestring];
            NSLog(@"%@f is the time difference",[date2 timeIntervalSinceDate:date1]);
            [df release];
            

            【讨论】:

              猜你喜欢
              • 2017-05-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-03-05
              • 2011-01-01
              • 2017-02-25
              • 2018-08-28
              相关资源
              最近更新 更多