iPhone에서 NSTimeInterval을 연도, 월, 일,시, 분 및 초로 나누려면 어떻게합니까?
몇 년에 걸친 시간 간격이 있고 1 년에서 몇 초까지의 모든 시간 구성 요소를 원합니다.
내 첫 번째 생각은 시간 간격을 1 년의 초로 정수 나누고, 초의 누적 합계에서 빼고, 한 달의 초로 나누고, 누적 합계에서 빼는 것입니다.
그것은 복잡한 것처럼 보이며 복잡한 것처럼 보이는 일을 할 때마다 아마도 내장 메서드가있을 것이라고 읽었습니다.
거기 있어요?
Alex의 두 번째 방법을 코드에 통합했습니다.
내 인터페이스의 UIDatePicker에 의해 호출되는 메서드에 있습니다.
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 년 1 개월 1 일 16 시간 0 분 20 초
1 개월 16 시간 할인입니다. 날짜 선택기를 1 일 전으로 설정하면 같은 금액만큼 벗어납니다.
업데이트 : 생일 (UIDatePicker에서 설정)을 고려하여 나이를 계산하는 앱이 있지만 종종 꺼져 있습니다. 이것은 부정확성이 있다는 것을 증명하지만 그것이 어디에서 오는지 알 수 없습니다.
간단한 설명
JBRWilkinson의 답변을 완성하는 또 다른 접근 방식이지만 코드를 추가합니다. 또한 Alex Reynolds의 의견에 대한 솔루션을 제공 할 수 있습니다.
NSCalendar 방법 사용 :
(NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts
"지정된 구성 요소를 사용하는 NSDateComponents 개체로 제공된 두 날짜 간의 차이를 반환합니다." (API 문서에서).
구분하려는 NSTimeInterval과 차이가있는 2 개의 NSDate를 만듭니다. (NSTimeInterval이 2 개의 NSDate를 비교하는 것에서 나온다면이 단계를 수행 할 필요가 없으며 NSTimeInterval도 필요하지 않고 NSCalendar 메서드에 날짜를 적용하면됩니다).
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]);
이 코드는 일광 절약 시간 및 기타 가능한 불쾌한 사항을 인식합니다.
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]);
간격을 NSDate
using 로 변환 +dateWithIntervalSince1970
하고 NSCalendar
의 -componentsFromDate
메서드 를 사용하여 날짜 구성 요소를 가져옵니다 .
iOS8 이상에서 사용할 수 있습니다. NSDateComponentsFormatter
사용자에게 친숙한 형식의 문자열로 시차를 변환하는 방법이 있습니다.
NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init];
formatter.unitsStyle = NSDateComponentsFormatterUnitsStyleFull;
NSLog(@"%@", [formatter stringFromTimeInterval:1623452]);
2 주, 4 일, 18 시간, 57 분, 32 초
이것은 나를 위해 작동합니다.
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];
여기서 가장 큰 차이점은 시간대를 조정해야한다는 것입니다.
또는 내 수업 방법이 있습니다. 수년을 처리하지는 않지만 며칠, 시간 및 분과 같은 작은 타임 랩에는 더 좋지만 쉽게 추가 할 수 있습니다. 복수형을 고려하고 필요한 것만 표시합니다.
+(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;
}
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.
...
- (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;
}
또 다른 가능성이 있습니다.
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;
'programing tip' 카테고리의 다른 글
생성자에서 암시 적 변환을 피합니다. (0) | 2021.01.06 |
---|---|
목록을 복사하는 가장 좋은 방법은 무엇입니까? (0) | 2021.01.06 |
UIScrollView에서 contentOffset은 무엇을합니까? (0) | 2021.01.06 |
전체 텍스트 파일을 Java의 문자열로 (0) | 2021.01.06 |
IntelliJ IDEA에 사용하지 않은 것으로 식별하지 말아야 할 방법 알리기 (0) | 2021.01.06 |