如何在iPhone上将NSTimeInterval分解成年,月,日,小时,分钟和秒钟?(How do I break down an NSTimeInterval into year, months,

编程入门 行业动态 更新时间:2024-10-15 18:26:01
如何在iPhone上将NSTimeInterval分解成年,月,日,小时,分钟和秒钟?(How do I break down an NSTimeInterval into year, months, days, hours, minutes and seconds on iPhone?)

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

我的第一个想法是将时间间隔整数除以一年的秒数,从运行的总共秒数中减去一个秒,将其除以一个月的秒数,从运行的总计中减去等等。

这似乎很复杂,我已经读过,只要你在做一些看起来很怪异的东西,可能是一个内置的方法。

在那儿?

我将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设置),但它经常关闭。 这证明有一个不准确,但我无法弄清楚它来自哪里,可以吗?

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.

Is there?

I integrated Alex's 2nd method into my code.

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);

When I set the date picker to a date 1 year and 1 day in the past, I get:

1 years 1 months 1 days 16 hours 0 minutes 20 seconds

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.

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的评论提供解决方案。

使用NSCalendar方法:

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

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

创建2个NSDate,其区别是要分解的NSTimeInterval。 (如果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]);

Brief Description

Just another approach to complete the answer of JBRWilkinson but adding some code. It can also offers a solution to Alex Reynolds's comment.

Use NSCalendar method:

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

"Returns, as an NSDateComponents object using specified components, the difference between two supplied dates". (From the API documentation).

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).

Get your quotes from NSDateComponents

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]);

更多推荐

本文发布于:2023-08-04 01:41:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1405479.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:上将   分解   小时   如何在   break

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!