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

在iPhone上,如何将NSTimeInterval分解为年、月、日、小时、分钟和秒?

  •  55
  • willc2  · 技术社区  · 16 年前

    我有一个跨越几年的时间间隔,我想要从一年到几秒的所有时间成分。

    我的第一个想法是将时间间隔除以一年中的秒数,从运行的秒数中减去,再除以一个月中的秒数,再从运行的秒数中减去,依此类推。

    有?

    我将Alex的第二种方法集成到我的代码中。

    NSDate *now = [NSDate date];
    NSDate *then = self.datePicker.date;
    NSTimeInterval howLong = [now timeIntervalSinceDate:then];
    
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:howLong];
    NSString *dateStr = [date description];
    const char *dateStrPtr = [dateStr UTF8String];
    int year, month, day, hour, minute, sec;
    
    sscanf(dateStrPtr, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minute, &sec);
    year -= 1970;
    
    NSLog(@"%d years\n%d months\n%d days\n%d hours\n%d minutes\n%d seconds", year, month, day, hour, minute, sec);
    

    1年1个月1天16小时0 分20秒

    休息1个月16个小时。如果我在过去将日期选择器设置为1天,则我的休假金额相同。

    更新 当前位置我有一个应用程序,可以根据你的生日(由UIDatePicker设置),以年为单位计算你的年龄,但它经常被关闭。这证明有点不准确,但我不知道它是从哪里来的,你说呢?

    9 回复  |  直到 15 年前
        1
  •  102
  •   skywinder Grady Player    10 年前

    简述

    1. 这只是完成JBRWilkinson答案的另一种方法,但添加了一些代码。它还可以为Alex Reynolds的评论提供一个解决方案。

      • (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts

      • “作为使用指定组件的NSDateComponents对象返回两个提供的日期之间的差异”。(来自API文档)。

    2. 创建2个NSDate,其差值为要细分的NSTIMEINTRATE。(如果您的NSTimeInterval来自比较2 NSDate,则不需要执行此步骤,甚至不需要NSTimeInterval,只需将日期应用于NSCalendar方法即可)。

    3. 从NSDateComponents获取您的报价

    示例代码

    // The time interval 
    NSTimeInterval theTimeInterval = ...;
    
    // Get the system calendar
    NSCalendar *sysCalendar = [NSCalendar currentCalendar];
    
    // Create the NSDates
    NSDate *date1 = [[NSDate alloc] init];
    NSDate *date2 = [[NSDate alloc] initWithTimeInterval:theTimeInterval sinceDate:date1]; 
    
    // Get conversion to months, days, hours, minutes
    NSCalendarUnit unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit;
    
    NSDateComponents *breakdownInfo = [sysCalendar components:unitFlags fromDate:date1  toDate:date2  options:0];
    NSLog(@"Break down: %i min : %i hours : %i days : %i months", [breakdownInfo minute], [breakdownInfo hour], [breakdownInfo day], [breakdownInfo month]);
    
        2
  •  17
  •   vikingosegundo    12 年前

    这段代码知道日光节约时间和其他可能的令人讨厌的事情。

    NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *components = [gregorianCalendar components: (NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit )
                                                        fromDate:startDate
                                                          toDate:[NSDate date]
                                                         options:0];
    
    
    NSLog(@"%ld", [components year]);
    NSLog(@"%ld", [components month]);
    NSLog(@"%ld", [components day]);
    NSLog(@"%ld", [components hour]);
    NSLog(@"%ld", [components minute]);
    NSLog(@"%ld", [components second]);
    
        3
  •  5
  •   Omkar    9 年前

    NSDateComponentsFormatter

    它有方法在用户友好的格式化字符串中转换时间差。

    NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init];
    formatter.unitsStyle = NSDateComponentsFormatterUnitsStyleFull;
    
    NSLog(@"%@", [formatter stringFromTimeInterval:1623452]);
    

    这给出了输出-2周4天18小时57分32秒

        4
  •  4
  •   gklka    9 年前

    将你的间歇时间转换成 NSDate 使用 +dateWithIntervalSince1970 ,使用 NSCalendar -componentsFromDate 方法。

    SDK Reference

        5
  •  3
  •   doogilasovich    15 年前

        float *lenghInSeconds = 2345.234513;
        NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:lenghInSeconds];
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    
    
        [formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
    
        [formatter setDateFormat:@"HH:mm:ss"];
        NSLog(@"%@", [formatter stringFromDate:date]); 
        [formatter release];
    

    这里的主要区别在于,您需要根据时区进行调整。

        6
  •  3
  •   sth    13 年前

    +(NSString *)TimeRemainingUntilDate:(NSDate *)date {
    
        NSTimeInterval interval = [date timeIntervalSinceNow];
        NSString * timeRemaining = nil;
    
        if (interval > 0) {
    
            div_t d = div(interval, 86400);
            int day = d.quot;
            div_t h = div(d.rem, 3600);
            int hour = h.quot;
            div_t m = div(h.rem, 60);
            int min = m.quot;
    
            NSString * nbday = nil;
            if(day > 1)
                nbday = @"days";
            else if(day == 1)
                nbday = @"day";
            else
                nbday = @"";
            NSString * nbhour = nil;
            if(hour > 1)
                nbhour = @"hours";
            else if (hour == 1)
                nbhour = @"hour";
            else
                nbhour = @"";
            NSString * nbmin = nil;
            if(min > 1)
                nbmin = @"mins";
            else
                nbmin = @"min";
    
            timeRemaining = [NSString stringWithFormat:@"%@%@ %@%@ %@%@",day ? [NSNumber numberWithInt:day] : @"",nbday,hour ? [NSNumber numberWithInt:hour] : @"",nbhour,min ? [NSNumber numberWithInt:min] : @"00",nbmin];
        }
        else
            timeRemaining = @"Over";
    
        return timeRemaining;
    }
    
        7
  •  2
  •   Alex Reynolds    16 年前
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeInterval];
    
    // format: YYYY-MM-DD HH:MM:SS ±HHMM
    NSString *dateStr = [date description];
    NSRange range;
    
    // year
    range.location = 0;
    range.length = 4;
    NSString *yearStr = [dateStr substringWithRange:range];
    int year = [yearStr intValue] - 1970;
    
    // month
    range.location = 5;
    range.length = 2;
    NSString *monthStr = [dateStr substringWithRange:range];
    int month = [monthStr intValue];
    
    // day, etc.
    ...
    
        8
  •  0
  •   ldiqual nicholjs    13 年前
    - (NSString *)convertTimeFromSeconds:(NSString *)seconds {
    
        // Return variable.
        NSString *result = @"";
    
        // Int variables for calculation.
        int secs = [seconds intValue];
        int tempHour    = 0;
        int tempMinute  = 0;
        int tempSecond  = 0;
    
        NSString *hour      = @"";
        NSString *minute    = @"";
        NSString *second    = @"";
    
        // Convert the seconds to hours, minutes and seconds.
        tempHour    = secs / 3600;
        tempMinute  = secs / 60 - tempHour * 60;
        tempSecond  = secs - (tempHour * 3600 + tempMinute * 60);
    
        hour    = [[NSNumber numberWithInt:tempHour] stringValue];
        minute  = [[NSNumber numberWithInt:tempMinute] stringValue];
        second  = [[NSNumber numberWithInt:tempSecond] stringValue];
    
        // Make time look like 00:00:00 and not 0:0:0
        if (tempHour < 10) {
            hour = [@"0" stringByAppendingString:hour];
        } 
    
        if (tempMinute < 10) {
            minute = [@"0" stringByAppendingString:minute];
        }
    
        if (tempSecond < 10) {
            second = [@"0" stringByAppendingString:second];
        }
    
        if (tempHour == 0) {
    
            NSLog(@"Result of Time Conversion: %@:%@", minute, second);
            result = [NSString stringWithFormat:@"%@:%@", minute, second];
    
        } else {
    
            NSLog(@"Result of Time Conversion: %@:%@:%@", hour, minute, second); 
            result = [NSString stringWithFormat:@"%@:%@:%@",hour, minute, second];
    
        }
    
        return result;
    
    }
    
        9
  •  -2
  •   Alex Reynolds    16 年前

    这里有另一种可能,稍微干净一些:

    NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeInterval];
    NSString *dateStr = [date description];
    const char *dateStrPtr = [dateStr UTF8String];
    
    // format: YYYY-MM-DD HH:MM:SS ±HHMM
    int year, month, day, hour, minutes, seconds;
    sscanf(dateStrPtr, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minutes, &seconds);
    year -= 1970;