我正在使用此函数返回给定的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];
为了更好地适应我的应用程序将使用的不同位置?
谢谢!
答案 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];