首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在iPhone上将NSTimeInterval分解为年、月、日、小时、分钟和秒?

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

Stack Overflow用户
提问于 2009-08-06 09:08:49
回答 9查看 48.5K关注 0票数 55

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

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

这似乎很复杂,我读到过,每当你做一些看起来令人费解的事情时,可能都有一个内置的方法。

在那里吗?

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

它在我的接口中由UIDatePicker调用的方法中。

代码语言:javascript
复制
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设置)来计算你的年龄,但它经常关闭。这证明有一个不准确,但我不知道它是从哪里来的,你说呢?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-09-06 21:18:51

简要说明

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

代码语言:javascript
复制
- `(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). 

  1. 创建2个NSDate,不同之处在于您要分解的NSTimeInterval。(如果您的NSTimeInterval来自比较2个NSDate,则不需要执行此步骤,甚至不需要NSTimeInterval,只需将日期应用于NSCalendar方法即可)。
  2. 从NSDateComponents

获取报价

示例代码

代码语言:javascript
复制
// 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]);
票数 102
EN

Stack Overflow用户

发布于 2013-02-17 22:11:18

这段代码知道夏令时和其他可能令人讨厌的事情。

代码语言:javascript
复制
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]);
票数 17
EN

Stack Overflow用户

发布于 2016-10-19 20:52:37

在iOS8和更高版本中,您可以使用NSDateComponentsFormatter

它有一些方法可以将时间差转换为用户友好的格式化字符串。

代码语言:javascript
复制
NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init];
formatter.unitsStyle = NSDateComponentsFormatterUnitsStyleFull;

NSLog(@"%@", [formatter stringFromTimeInterval:1623452]);

输出结果为-2周4天18小时57分32秒

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1237778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档