【问题标题】:Date comparison in showing null显示空的日期比较
【发布时间】:2016-10-19 10:46:21
【问题描述】:

我有两个这样的约会,

NSString *givendate = @"2016-10-07T13:01:20";
NSDate *currentDateTime = [NSDate date];

我想通过比较当前日期和给定日期来计算 5 天或 6 天等天数。

我尝试了以下代码。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFromString = [dateFormatter dateFromString:givendate];
NSTimeInterval diff = [currentDateTime timeIntervalSinceDate:dateFromString];
NSString *intervalString = [NSString stringWithFormat:@"%f", diff];
cell.days.text=intervalString;

但它会打印“nan”。任何帮助将不胜感激。

【问题讨论】:

  • 我敢打赌,如果你 NSLog 你的 dateFromString 变量你会得到零。
  • 是的,它正在打印空值。我在哪里做错了?
  • 您需要在日期格式化程序yyyy-MM-dd'T'HH:mm:ss中设置适当的日期格式来解析ISO8601字符串。
  • 我将添加到@vadian 评论:为什么以及如何dateFormatter 应该知道格式是什么?因为,确实有很多变化可能,甚至可能适用于相同样本但最后给出不同日期的变化。

标签: objective-c nsdate nsdateformatter


【解决方案1】:

您必须根据您的日期字符串为NSDateFormatter指定dateFormat,如下所示,否则它将返回nilnan

    NSDate *dateFromString;

    NSString *givendate = @"2016-10-07T13:01:20";
    NSDate *currentDateTime = [NSDate date];

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];//Set format here accordingly
    dateFromString = [dateFormatter dateFromString:givendate];
    NSTimeInterval diff = [currentDateTime timeIntervalSinceDate:dateFromString];
    NSString *intervalString = [NSString stringWithFormat:@"%f", diff];

上面的代码对我有用。

编辑:

int num_days = diff / (60 * 60 * 24);
int num_seconds -= num_days * (60 * 60 * 24);
int num_hours = num_seconds / (60 * 60);
int num_seconds -= num_hours * (60 * 60);
int num_minutes = num_seconds / 60;

使用NSGregorianCalendar,如下所示:

    NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSGregorianCalendar];

    NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
    NSDateComponents *components = [gregorian components:unitFlags
                                            fromDate:dateFromString
                                              toDate:currentDateTime options:0];
    NSInteger years = [components year];
    NSInteger months = [components month];
    NSInteger days = [components day]; 
    NSLog(@"years = %ld months = %ld days = %ld",years,months,days);

【讨论】:

  • 这样打印 1050035.00 。但我需要 5 天或 6 天这样的时间。有什么帮助吗?
  • 我试过上面的代码。我在这条线上遇到错误。 NSDateComponents *components = [gregorian components:unitFlags fromDate:dateFromString currentDateTime options:0];
【解决方案2】:

我不确定,但可能是因为您没有设置日期格式:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"]; //According to date and time format;
dateFromString = [dateFormatter dateFromString:givendate];
NSTimeInterval diff = [currentDateTime timeIntervalSinceDate:dateFromString];
NSString *intervalString = [NSString stringWithFormat:@"%f", diff];
cell.days.text=intervalString;

【讨论】:

  • 哦,太好了,我不知道感谢您的时间先生:)
【解决方案3】:

对于“它像这样打印 1050035.00 。但我需要 5 天或 6 天这样的时间。有什么帮助吗?”

由于它以毫秒为单位返回,因此您需要将其转换为天数。

NSCalendar *_calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
NSCalendarUnit _units = NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
NSDateComponents *_components = [_calendar components:_units fromDate:[NSDate date] toDate:[NSDate dateWithTimeIntervalSinceNow:_timeInSeconds] options:kNilOptions];

NSLog(@"%ld Days, %ld Hours, %ld Minutes, %ld Seconds", _components.day, _components.hour, _components.minute, _components.second);

在你的情况下,输出:12 天,3 小时,40 分钟,35 秒

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 2020-10-06
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多