Swift NSDATE组件格式';s stringFromDate(uz,toDate:)返回nil 问题:

Swift NSDATE组件格式';s stringFromDate(uz,toDate:)返回nil 问题:,swift,nsdate,nsdateformatter,nsdatecomponents,nsdatecomponentsformatter,Swift,Nsdate,Nsdateformatter,Nsdatecomponents,Nsdatecomponentsformatter,为什么stringnil let formatter = NSDateComponentsFormatter() let referenceDate = NSDate(timeIntervalSinceReferenceDate: 0) let intervalDate = NSDate(timeInterval: 3628810, sinceDate: referenceDate) let string = formatter.stringFromDate(referenceDate, toD

为什么
string
nil

let formatter = NSDateComponentsFormatter()
let referenceDate = NSDate(timeIntervalSinceReferenceDate: 0)
let intervalDate = NSDate(timeInterval: 3628810, sinceDate: referenceDate)
let string = formatter.stringFromDate(referenceDate, toDate: intervalDate)
我希望返回像“6w 10s”这样的字符串

(6周为3628800秒。)


试图排除故障 为了排除故障,我尝试设置
允许的单位

formatter.allowedUnits = .YearCalendarUnit | .MonthCalendarUnit | .WeekCalendarUnit | .DayCalendarUnit | .HourCalendarUnit | .MinuteCalendarUnit | .SecondCalendarUnit
导致此错误的原因:

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

我不知道什么是“位置单位”(足球之外),我也不认为我在指定任何差距


笔记 我没有使用
stringFromTimeInterval()
,因为这将根据系统的当前日期返回不同的结果。(也就是说,2月份一个月只有28/29天。)我想计算从
NSDate
参考日期开始的时间间隔

我使用的是Xcode 6.1.1(6A2008a)。如果有帮助,这里有一个游乐场截图:


这对我来说可以消除“差距”:

从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
因此:


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

formatter.allowedUnits = nil
formatter.allowedUnits |= .CalendarUnitYear
formatter.allowedUnits |= .CalendarUnitMonth
formatter.allowedUnits |= .CalendarUnitWeekOfMonth
formatter.allowedUnits |= .CalendarUnitDay
// formatter.allowedUnits |= .CalendarUnitHour
formatter.allowedUnits |= .CalendarUnitMinute
formatter.allowedUnits |= .CalendarUnitSecond

“用间隙指定位置单位是不明确的,因此不受支持”
错误:)我认为这就是“间隙”的意思。

解决这个问题的Swift 3.0版本

 let dateFormatted = DateComponentsFormatter()

 dateFormatted.allowedUnits = [NSCalendar.Unit.year, NSCalendar.Unit.month, NSCalendar.Unit.weekOfMonth ,NSCalendar.Unit.day, NSCalendar.Unit.hour, NSCalendar.Unit.minute, NSCalendar.Unit.second]

 let autoFormattedDifference = dateFormatted.string(from: currentDate, to: dateFromTimestamp)

 print("The difference between dates is: \(autoFormattedDifference!)")

现在这里的差异是从升序或降序给出allowUnits的所有值。

不指定单位样式将导致Swift 45中出现这种情况

let componentsFormatter = DateComponentsFormatter()
componentsFormatter.unitsStyle = .full

其他单位样式:
.spellOut
.short
.brief
.缩写
.positional

不返回
nil
(返回“42d 0:00:10”),但为什么我不能获得周/月/年?
stringFromTimeInterval()
使用当前日期作为开始日期返回周/月/年没有问题。我认为这是一个API错误-文档讨论了一组默认的允许单位,因此它不应该只从未配置的调用返回
nil
。啊,所以它是
。WeekOfMonth
,而不是
。Week
-这可以解释“差距”错误。是的,我们无法使用
.WeekCalendarUnit
,并且被忽略。这就是我认为的“差距”。还有一个bug,因为它显然没有做到这一点:“默认值是……年|月|周|天|小时|分钟|秒,如果超过一个NSTimeInterval或一对NSDate。”在iOS 12上,跳过
。weekOfMonth
会导致此崩溃。这是有效的:
formatter.allowedUnits=[.year、.month、.weekOfMonth、.day、.hour、.minute、.second]
 let dateFormatted = DateComponentsFormatter()

 dateFormatted.allowedUnits = [NSCalendar.Unit.year, NSCalendar.Unit.month, NSCalendar.Unit.weekOfMonth ,NSCalendar.Unit.day, NSCalendar.Unit.hour, NSCalendar.Unit.minute, NSCalendar.Unit.second]

 let autoFormattedDifference = dateFormatted.string(from: currentDate, to: dateFromTimestamp)

 print("The difference between dates is: \(autoFormattedDifference!)")
let componentsFormatter = DateComponentsFormatter()
componentsFormatter.unitsStyle = .full