如何在iPhone上将NSTimeInterval分解为年,月,日,小时,分钟和秒? [英] How do I break down an NSTimeInterval into year, months, days, hours, minutes and seconds on iPhone?

查看:159
本文介绍了如何在iPhone上将NSTimeInterval分解为年,月,日,小时,分钟和秒?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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?

推荐答案

这是一个不正确的问题,简要说明


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

  1. 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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆