当天开始的NSDate打印为前一天的下午晚些时候

时间:2014-10-14 17:53:27

标签: ios objective-c cocoa-touch date nsdate

我试图使用此代码从今天的日期开始单独(没有时间)获取日期:

NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *date1Components = [cal components: NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:[NSDate date]];

NSLog(@"Today without time :%@",[cal dateFromComponents:date1Components]);

结果是:

  

2014-10-14 23:01:13.398 TestViewHier [5349:60b]今日无时间:2014-10-13 18:30:00 +0000

我来自印度,现在的时间是:2014-10-14 11:16 pm,但结果显示有一天休息和一些随机时间。

我的预期结果是2014-10-14 00:00:00,因为我需要将此日期与其他日期进行比较。我将从服务中获取产品的到期日期,如果日期小于或等于当前日期,我需要在“过期产品”部分中显示产品。我可以使用NSDate的比较方法来比较这两个日期。

2 个答案:

答案 0 :(得分:1)

NSDate始终是UTC(通用时间)的时间点。

您已 当前时间。

您使用印度日历提取年,月和日,以便获得您期望的值。

您将这些组件转换为NSDate。这给出了印度 天开始时的时间点。因为距离UTC只有5个半小时,所以UTC的那个时间点将是前一天的18:30。换句话说,如果你在一天开始时(午夜)打电话给我,我看了我的日历和手表,我的日历会显示前一天,我的手表会显示18:30。

这就是NSLog显示的内容。 NSDate绝对正确;根据您的日历, 是一天的开始。您的一天从UTC时间18:30开始。

答案 1 :(得分:0)

要使用NSDateFormatter方法获取带有日期的字符串,请使用startOfDayForDate方法:OSX 10.9和iOS 8.0中提供NSDate *date = [NSDate date]; NSLog(@"date: %@", date); NSDate *dateOnlyString = [[NSCalendar currentCalendar] startOfDayForDate:date]; NSLog(@"dateOnlyString: %@", dateOnlyString);

示例:

NSLog

输出:

date:           2014-10-14 18:11:43 +0000  
dateOnlyString: 2014-10-14 04:00:00 +0000

但真正的问题可能是NSDate使用description NSDateFormatter方法。这会根据您可能不需要的几个条件显示日期/时间。如果要以特定格式查看日期,请使用{{1}}创建显示字符串。