在NSDate中省略秒数

时间:2015-09-16 11:54:10

标签: ios objective-c nsdate nscalendar nsdatecomponents

我正在使用此函数返回给定的NSDate,没有秒或纳秒:

-(NSDate *)dateByOmittingSeconds:(NSDate *)date
{
NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSCalendarIdentifierGregorian]; // Setup an NSCalendar
NSDateComponents *components = [gregorianCalendar components: NSUIntegerMax fromDate: date]; // Setup NSDateComponents
[components setSecond:0]; // Set the seconds
[components setNanosecond:0]; // Set the nanoseconds

return [gregorianCalendar dateFromComponents: components];
}

我正在初始化NSCalendar,如此:

[[NSCalendar alloc] initWithCalendarIdentifier: NSCalendarIdentifierGregorian];

我会使用它,或者这种初始化会更好:

[NSCalendar currentCalendar];

为了更好地适应我的应用程序将使用的不同位置?

谢谢!

4 个答案:

答案 0 :(得分:1)

NSDate个对象代表精确的时刻(无论日历如何)。没有理由在这里涉及日历。

只需使用fmod

- (NSDate *) dateByOmittingSeconds:(NSDate *) date
{
     NSTimeInterval ti = [date timeIntervalSinceReferenceDate];
     ti = ti - fmod(ti, 60.0);
     return [NSDate dateWithTimeIntervalSinceReferenceDate:ti];
}

或者,除以并重新乘以60:

- (NSDate *) dateByOmittingSeconds:(NSDate *) date
{
     NSTimeInterval ti = [date timeIntervalSinceReferenceDate];
     ti = floor(ti / 60.0) * 60.0;
     return [NSDate dateWithTimeIntervalSinceReferenceDate:ti];
}

答案 1 :(得分:0)

根据您的要求和Apple的文档,我会选择第二个选项。 -initWithCalendarIdentifier将返回您指定的日历,这不是非常动态的。另一方面,+currentCalendar将根据系统区域设置和任何自定义用户设置返回“当前用户的逻辑日历”。

这是Apple关于主题的文档:

  

+ currentCalendar

     

返回当前用户的逻辑日历。

     

返回的日历是根据设置形成的   当前用户选择的系统区域设置覆盖任何自定义设置   用户已在“系统偏好设置”中指定。 您获得的设置   因为系统偏好设置已更改,此日历不会更改   你的操作是一致的(与之形成鲜明对比)   autoupdatingCurrentCalendar)。

     

-initWithCalendarIdentifier:

     

为指定标识符指定的日历初始化新分配的NSCalendar对象

     

初始化日历,如果标识符未知,则为nil(例如,如果它是无法识别的字符串或当前版本的操作系统不支持日历)。

答案 2 :(得分:0)

这取决于你想对日期做什么。如果您只是想向用户显示(或在本地存储),最好使用用户的设置。你可以通过+currentCalendar得到这个。如果您想在世界各地分享日期(即将其发送到服务器),最好为所有应用程序使用统一日历。

答案 3 :(得分:-1)

我的代码可以帮助您。您可以在没有秒和纳秒的情况下获取日期

NSDate *date;
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear | NSCalendarUnitHour | NSCalendarUnitMinute  fromDate:date];