【问题标题】:Strange NSDate after changing hour更改时间后奇怪的NSDate
【发布时间】:2018-12-16 20:11:10
【问题描述】:

我想更改 NSDate 中的时间。我做了这样的事情:

NSDate *final = [gregorian dateBySettingUnit:NSCalendarUnitHour value:hour.intValue ofDate:self.dateForNewEvent options:NSCalendarMatchStrictly];

其中 self.dateForNewEvent = 2018-07-09 07:24:13 +0000 和 hour.intValue = 5,我预计日期 = 2018-07-09 05:00:00 + 0000 但我得到了 2018-07-10 03:00:00 UTC。我应该怎么做才能得到预期的日期?

【问题讨论】:

    标签: ios objective-c timezone nsdate


    【解决方案1】:

    我认为您将NSDateNSCalendar 混合在一起:NSDate 是一个时间点,在内部以UTC 表示。要获取日历或手表上显示的本地日期/时间,请使用NSCalendar

    因此,如果您在 MEST (UTC+2) 并且在日历上将时间设置为“5”小时,那么这将是 UTC“3”小时。

    要取回日历日期/时间,您可以使用来自NSCalendarcomponents(_:from:)


    只需检查此代码:

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];
    NSDate * dateForNewEvent = [dateFormatter dateFromString: @"2018-07-09T07:24:13+00:00"];
    NSLog(@"dateForNewEvent: %@", dateForNewEvent);
    
    
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    
    NSDateComponents *comps = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear|NSCalendarUnitHour|NSCalendarUnitMinute fromDate:dateForNewEvent];
    [comps setHour:5];
    
    NSDate *final = [gregorian dateFromComponents:comps];
    NSLog(@"final: %@", final);
    

    按预期输出:

    2018-07-09 11:11:43.542 jdoodle[22:22] dateForNewEvent: 2018-07-09 07:24:13 +0000

    2018-07-09 11:11:43.542 jdoodle[22:22] 决赛:2018-07-09 05:24:00 +0000

    【讨论】:

      【解决方案2】:

      要更改特定NSDate 的营业时间,您需要通过NSDateComponents 对其进行操作。请尝试以下代码:

      NSDate *now = [NSDate date]; // YOUR DATE INSTANCE
      NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSCalendarIdentifierGregorian];
      NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond fromDate:now];
      [components setHour:5];
      NSDate *today5am = [calendar dateFromComponents:components];
      
      NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
      [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
      [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
      NSLog(@"Date ===>>> %@",[dateFormatter stringFromDate:[NSDate date]]);
      

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-10
        相关资源
        最近更新 更多