【问题标题】:NSDate for the beginning of the current day prints as late afternoon on the previous day [duplicate]当天开始的 NSDate 打印为前一天下午晚些时候 [重复]
【发布时间】:2014-10-14 17:53:27
【问题描述】:

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

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的比较方法比较两个日期。

【问题讨论】:

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


【解决方案1】:

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

您使用了您的当前时间。

您使用印度历法提取年、月和日,从而获得您期望的值。

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

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

【讨论】:

  • 好的,但问题是如何在没有时间的情况下获取他的当前日期(对于他的时区)
  • @JoelFan:正如 gnasher 所说,OP 已经拥有他想要的;日期不包括时区信息。它在打印出来时显示 GMT,但它表示的时间点 OP 时区2014-10-14 一天的开始。
  • @gnasher729:我在晚上 11:16(不是一天的开始,几乎是一天的结束)执行了上述代码,这意味着同一天 UTC 下午 5:30。怎么会放假一天
  • @JoelFan:OP时区是什么意思?
  • @JoshCaswell,日期(即使没有时间)肯定会受到时区的影响。 OP 希望日期对于他的时区是正确的,只是不包括时间
【解决方案2】:

若要获取包含日期但不包含时间的字符串,请使用 NSDateFormatter 方法:startOfDayForDate 在 OSX 10.9 和 iOS 8.0 中可用。

例子:

NSDate *date = [NSDate date];
NSLog(@"date:           %@", date);

NSDate *dateOnlyString = [[NSCalendar currentCalendar] startOfDayForDate:date];
NSLog(@"dateOnlyString: %@", dateOnlyString);

输出:

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

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

【讨论】:

    猜你喜欢
    • 2015-11-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    相关资源
    最近更新 更多