【问题标题】:Omit seconds in NSDate在 NSDate 中省略秒数
【发布时间】:2015-09-16 11:54:09
【问题描述】:

我正在使用这个函数来返回一个给定的 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];

为了更恰当地适应我的应用会在不同的地方使用吗?

谢谢!

【问题讨论】:

  • 使用[NSCalendar currentCalendar]

标签: ios objective-c nsdate nscalendar nsdatecomponents


【解决方案1】:

NSDate 对象代表时间的精确时刻(不考虑日历)。这里根本没有理由涉及日历。

只需使用fmod:

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

或者,除以 60 再乘以 60:

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

【讨论】:

  • 在祈祷没有带秒的时间偏移之后,在祈祷用户日历中“秒”、“分钟”、“小时”的含义相同之后,你还是要祈祷,即没有闰秒。
  • @AminNegm-Awad: NSDate 对象没有时区,完全不依赖于任何日历,而且 Cocoa 的 API 也不考虑闰秒。
  • @AminNegm-Awad:另外,NSTimeInterval 代表 NTP 秒数。
  • 确实,NSDate 没有 tz。这是问题,因为用户的时间有一个tz。他得到的可能在用户的时间里没有一分钟。
  • NTP 支持闰秒。
【解决方案2】:

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

这是 Apple 关于这些主题的文档:

+当前日历

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

返回的日历由 当前用户选择的系统区域设置覆盖了任何自定义设置 用户已在系统偏好设置中指定。 您从中获得的设置 此日历不会随着系统偏好设置的更改而更改,因此 您的操作是一致的(与 自动更新当前日历)。

-initWithCalendarIdentifier:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多