【问题标题】:Wrong date comes back from NSDateComponents从 NSDateComponents 返回错误的日期
【发布时间】:2013-05-07 09:44:15
【问题描述】:

为什么这给了我错误的日期?

 NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
    NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
    [components setYear:2013];
    [components setMonth:06];
    [components setDay:28];
    [components setHour:5];
    [components setMinute:00];
    NSDate *startDate1 = [myCalendar dateFromComponents:components];
    NSLog(@"start date is %@",startDate1);

开始日期是 2013-06-28 03:00:00 +0000

编辑

我想做的是以下。我有一个开始和结束。

例如:

开始日期是2013-06-28 05:00

结束日期是:2013-06-29 04:59

然后我想检查当前日期是否在开始日期和结束日期之间。我正在使用以下内容。

NSComparisonResult result1 = [now compare:startDate1];
    NSComparisonResult result2 = [now compare:endDate1];

if (result2 == NSOrderedSame && result1 == NSOrderedSame ) {
        NSLOG(@"OKE!");
 }

【问题讨论】:

  • 您的日期值取决于时区。将其更改为您当地的时区将解决您的问题。设置-常规-日期和时间。

标签: iphone ios objective-c nsdate nsdatecomponents


【解决方案1】:

可能日期是正确的,但您误解了日志:

记录日期总是在 TZ +0000 中完成。例如,如果您在中欧,您将有(预期?)日期 2013-06-28 05:00:00 +0200,但日志将显示标准化日期 2013-06-28 03:00:00 +0000。这是相同的日期和时间!它只是以不同的方式表达。

+++

如果你的组件也在 TZ +0000,你应该设置日历的时区。

【讨论】:

    【解决方案2】:

    您可以像这样检查当前日期是否在两个日期之间:

    NSDate *now = [NSDate date];
    BOOL betweenStartAndEnd = ([startDate compare:now] == NSOrderedAscending && [endDate compare:now] == NSOrderedDescending);
    

    您的代码实际上会检查测试日期是否与开始日期和结束日期相等(NSOrderedSame)(当然不是)

    result2 == NSOrderedSame && result1 == NSOrderedSame
    

    查看我的扩展示例:

    NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
    NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
    [components setYear:2013];
    [components setMonth:05];
    [components setDay:13];
    [components setHour:18];
    [components setMinute:00];
    NSDate *startDate = [myCalendar dateFromComponents:components];
    [components setDay:15];
    NSDate *endDate = [myCalendar dateFromComponents:components];
    
    NSDate *now = [NSDate date];
    BOOL betweenStartAndEnd = ([startDate compare:now] == NSOrderedAscending && [endDate compare:now] == NSOrderedDescending);
    
    NSLog(@"Date %@ %@ between %@ and %@", now, betweenStartAndEnd ? @"IS" : @"IS NOT", startDate, endDate);
    

    这会将其打印到控制台:

    Date 2013-05-13 15:44:06 +0000 IS NOT between 2013-05-13 16:00:00 +0000 and 2013-05-15 16:00:00 +0000
    

    【讨论】:

      【解决方案3】:

      这是因为您必须使用设备的时区打印日期,否则它会以 UTC 显示。

      NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
          NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
          [components setYear:2013];
          [components setMonth:06];
          [components setDay:28];
          [components setHour:5];
          [components setMinute:00];
          NSDate *startDate1 = [myCalendar dateFromComponents:components];
          NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
          formatter.timeZone = [NSTimeZone systemTimeZone];
          formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
          NSLog(@"%@", [formatter stringFromDate:startDate1]);
      

      【讨论】:

      • 嗨,我已经用更多细节编辑了我的问题。我想我不能像你那样比较字符串?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多