NSDateComponentsFormatter的stringFromDate(_,toDate :)返回nil

Aar*_*ger 6 nsdate nsdateformatter nsdatecomponents swift nsdatecomponentsformatter

为什么是string零?

let formatter = NSDateComponentsFormatter()
let referenceDate = NSDate(timeIntervalSinceReferenceDate: 0)
let intervalDate = NSDate(timeInterval: 3628810, sinceDate: referenceDate)
let string = formatter.stringFromDate(referenceDate, toDate: intervalDate)
Run Code Online (Sandbox Code Playgroud)

我期待返回像"6w 10s"这样的字符串.

(6周是3,628,800秒.)


尝试排除故障

要进行故障排除,我尝试设置allowedUnits:

formatter.allowedUnits = .YearCalendarUnit | .MonthCalendarUnit | .WeekCalendarUnit | .DayCalendarUnit | .HourCalendarUnit | .MinuteCalendarUnit | .SecondCalendarUnit
Run Code Online (Sandbox Code Playgroud)

导致此错误:

"NSInvalidArgumentException","指定带间隙的位置单位是不明确的,因此不受支持"

我不知道什么是"位置单位"(在足球之外),我认为我没有指出任何差距.


笔记

没有使用,stringFromTimeInterval()因为根据系统的当前日期,它将返回不同的结果.(即,二月只有一个月的28/29天.)我想计算NSDate参考日期开始的时间间隔.

我正在使用Xcode 6.1.1(6A2008a).这是一个Playground屏幕截图,如果有帮助:

在此输入图像描述

rin*_*aro 6

来自headerdoc:

/* Bitmask of units to include. Set to 0 to get the default behavior.
   Note that, especially if the maximum number of units is low, unit
   collapsing is on, or zero dropping is on, not all allowed units may
   actually be used for a given NSDateComponents. Default value is the
   components of the passed-in NSDateComponents object, or years | 
   months | weeks | days | hours | minutes | seconds if passed an
   NSTimeInterval or pair of NSDates.

   Allowed units are:

    NSCalendarUnitYear
    NSCalendarUnitMonth
    NSCalendarUnitWeekOfMonth (used to mean "quantity of weeks")
    NSCalendarUnitDay
    NSCalendarUnitHour
    NSCalendarUnitMinute
    NSCalendarUnitSecond

   Specifying any other NSCalendarUnits will result in an exception.
 */
var allowedUnits: NSCalendarUnit
Run Code Online (Sandbox Code Playgroud)

所以:

let formatter = NSDateComponentsFormatter()
formatter.calendar = NSCalendar.currentCalendar()
formatter.allowedUnits = nil
formatter.allowedUnits |= .CalendarUnitYear
formatter.allowedUnits |= .CalendarUnitMonth
formatter.allowedUnits |= .CalendarUnitWeekOfMonth
formatter.allowedUnits |= .CalendarUnitDay
formatter.allowedUnits |= .CalendarUnitHour
formatter.allowedUnits |= .CalendarUnitMinute
formatter.allowedUnits |= .CalendarUnitSecond

let referenceDate = NSDate(timeIntervalSinceReferenceDate: 0)
let intervalDate = NSDate(timeInterval: 214458810, sinceDate: referenceDate)
let string = formatter.stringFromDate(referenceDate, toDate: intervalDate)
// -> "6y 9m 2w 4d 3:53:30"
Run Code Online (Sandbox Code Playgroud)

当我们在中间省略其中一个时:

formatter.allowedUnits = nil
formatter.allowedUnits |= .CalendarUnitYear
formatter.allowedUnits |= .CalendarUnitMonth
formatter.allowedUnits |= .CalendarUnitWeekOfMonth
formatter.allowedUnits |= .CalendarUnitDay
// formatter.allowedUnits |= .CalendarUnitHour
formatter.allowedUnits |= .CalendarUnitMinute
formatter.allowedUnits |= .CalendarUnitSecond
Run Code Online (Sandbox Code Playgroud)

'Specifying positional units with gaps is ambiguous, and therefore unsupported' 错误:)我认为这就是"差距"的意思.

  • 是的,我们不能使用`.WeekCalendarUnit`,而忽略了.这就是我认为的"差距". (2认同)
  • 还有一个错误,因为它显然没有这样做:"如果传递了NSTimeInterval或NSDates对,则默认值为...... years | months | weeks | days |小时|分钟|秒." (2认同)