代码之家  ›  专栏  ›  技术社区  ›  Anders

NSDate清零小时分和秒[重复]

  •  5
  • Anders  · 技术社区  · 11 年前

    我有一个NSDate,我想把小时、分钟和秒清零。我想要的结果是: 2014-02-19 00:00:00 +0000 。我尝试了以下操作:

    NSUInteger flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
    NSDateComponents* components = [[NSCalendar currentCalendar] components:flags fromDate:self.birthDatePicker.date];
    NSDate* birthDate = [[NSCalendar currentCalendar] dateFromComponents:components];
    

    出于某种原因,我明白了: 2014-02-19 23:00:00 +0000 。小时没有归零。我也尝试过设置 [components setHour:0] 但我得到了同样的结果 23 持续数小时。你知道我做错了什么吗?

    3 回复  |  直到 11 年前
        1
  •  3
  •   Andrea    11 年前

    请在NSDate上考虑此类别:

    @interface NSDate (Utilities)
    - (NSDate *) dateAtStartOfDay;
    @end
    
    @implementation
    - (NSDate *) dateAtStartOfDay
    {
    
       NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekCalendarUnit |  NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekdayCalendarUnit | NSWeekdayOrdinalCalendarUnit) fromDate:self];
       [components setHour:0];
       [components setMinute:0];
       [components setSecond:0];
       return [[NSCalendar currentCalendar] dateFromComponents:components];
    }
    @end
    

    代码取自Erika Sadun NSDate Extension

        2
  •  3
  •   Ossir    11 年前

    查看此库: https://github.com/mysterioustrousers/MTDates

    我也遇到了类似的问题,我决定使用它。它有很多与日期相关的功能。您需要的是:

    - (NSDate *)mt_startOfCurrentDay;
    

    关于时区。NSDate独立于时区格式。您可以在NSDateFormatter实例中指定所需的时区。

    使现代化 完整代码示例

    NSDate *date = [NSDate date];
    NSLog(@"%@", date); // 2014-02-20 11:11:40 +0000
    [NSDate mt_setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
    NSLog(@"%@", [[date mt_startOfCurrentDay] mt_stringFromDateWithISODateTime]); // 2014-02-20 00:00:00 +0000
    

    对于其他日期格式,请使用时区和自定义日期格式设置NSDateFormatter

    还有一个解决方案 这一个没有库:

    NSDate *date = [NSDate date];
    NSLog(@"%@", date); // 2014-02-20 11:36:20 +0000
    NSUInteger flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
    NSCalendar *currentCalendar = [NSCalendar currentCalendar];
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:currentCalendar.calendarIdentifier];
    calendar.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    NSDateComponents* components = [calendar components:flags fromDate:date];
    date = [calendar dateFromComponents:components];
    NSLog(@"%@", date); // 2014-02-20 00:00:00 +0000
    

    P.S.Btw我有GMT+3时区

        3
  •  0
  •   user1804762 user1804762    11 年前

    总是有帮助:

    WWDC视频

    2011 Session 117 - Performing Calendar Calculations

    2013 Session 227 - Solutions to Common Date and Time Challenges


    这包含您可能需要的信息:

    一场 227 @ 13毫秒25秒 ,“常用操作”/“计算午夜”。