如何在iPhone上将NSTimeInterval分解为年,月,日,小时,分钟和秒? [英] How do I break down an NSTimeInterval into year, months, days, hours, minutes and seconds on iPhone?
问题描述
我有一个时间间隔跨越几年,我想要所有的时间组件从一年到秒。
I have a time interval that spans years and I want all the time components from year down to seconds.
我的第一个想法是整数除以时间间隔秒,从一个运行总秒数中减去,再除以一个月中的秒数,再从运行总数中减去。
My first thought is to integer divide the time interval by seconds in a year, subtract that from a running total of seconds, divide that by seconds in a month, subtract that from the running total and so on.
我已经读过,每当你做的东西看起来很复杂,可能是一个内置的方法。
That just seems convoluted and I've read that whenever you are doing something that looks convoluted, there is probably a built-in method.
有吗?
我将Alex的第二种方法集成到我的代码中。
I integrated Alex's 2nd method into my code.
这是一个UIDatePicker在我的界面中调用的方法。
It's in a method called by a UIDatePicker in my interface.
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天的日期时,
When I set the date picker to a date 1 year and 1 day in the past, I get:
1年1个月1天16小时0
分20秒
1 years 1 months 1 days 16 hours 0 minutes 20 seconds
这是1个月和16小时。如果我将日期选择器设置为过去的1天,那么我会得到相同的金额。
which is 1 month and 16 hours off. If I set the date picker to 1 day in the past, I am off by the same amount.
更新:我有一个应用计算你的年龄,给定你的生日(从UIDatePicker设置),但它经常关闭。
Update: I have an app that calculates your age in years, given your birthday (set from a UIDatePicker), yet it was often off. This proves there was an inaccuracy, but I can't figure out where it comes from, can you?
推荐答案
这是一个不正确的问题,简要说明
-
只是另一种方法来完成JBRWilkinson的答案,但添加了一些代码。它还可以为Alex Reynolds的评论提供解决方案。
Just another approach to complete the answer of JBRWilkinson but adding some code. It can also offers a solution to Alex Reynolds's comment.
使用NSCalendar方法:
Use NSCalendar method:
-
(NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts
作为使用指定组件的NSDateComponents对象,返回两个提供日期之间的差异。 (从API文档)。
"Returns, as an NSDateComponents object using specified components, the difference between two supplied dates". (From the API documentation).
创建2 NSDate,它们的区别是您要分解的NSTimeInterval。 (如果你的NSTimeInterval来自比较2 NSDate,你不需要做这个步骤,你甚至不需要NSTimeInterval,只是应用日期到NSCalendar方法)。
Create 2 NSDate whose difference is the NSTimeInterval you want to break down. (If your NSTimeInterval comes from comparing 2 NSDate you don't need to do this step, and you don't even need the NSTimeInterval, just apply the dates to the NSCalendar method).
从NSDateComponents取得报价
Get your quotes from NSDateComponents
示例代码 p>
Sample Code
// 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]);
这篇关于如何在iPhone上将NSTimeInterval分解为年,月,日,小时,分钟和秒?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!