DateComponentsFormatter 和 .nanosecond

DateComponentsFormatter and .nanosecond

因此,我在只需要格式化给定 TimeInterval 的纳秒的情况下使用 DateComponentsFormatter。问题是它没有按预期工作,或者我在这里混淆了一些我不知道的东西。

这里有 3 个快速测试来说明我在说什么。

第一个场景

let fooFormatter = DateComponentsFormatter()

fooFormatter.allowedUnits = [.second, .nanosecond]
fooFormatter.unitsStyle = .full
fooFormatter.collapsesLargestUnit = true
fooFormatter.allowsFractionalUnits = true

print(fooFormatter.string(from: 42.42424242424242424242424242424242))

输出Optional("42 seconds").

预期:因为这会折叠 "largest unit"(在本例中为秒),所以预计会像 (Optional("42.42424242424242424242424242424242 * 1e^9")).

第二个场景

let fooFormatter = DateComponentsFormatter()

fooFormatter.allowedUnits = [.second, .nanosecond]
fooFormatter.unitsStyle = .full
fooFormatter.allowsFractionalUnits = true

print(fooFormatter.string(from: 42.42))

输出Optional("42 seconds").

预期:即使没有选择不折叠 .second,我也希望接近 (Optional("42 seconds 0.42 * 1e^9 nanoseconds")).

第三种情况

let fooFormatter = DateComponentsFormatter()
fooFormatter.allowedUnits = [.nanosecond]
fooFormatter.unitsStyle = .full
fooFormatter.allowsFractionalUnits = true

print(fooFormatter.string(from: 42.424242))

输出nil.

预期:现在它甚至不会将 TimeInterval 识别为有效 - 当它被定义为可能的最小分数时 - 并且显然预期一切都以纳秒为单位。

重要的是要注意我使用了 allowsFractionalUnits = true,这更 令人担忧 ,因为这种行为在上面给出的输出中也不起作用(参见预期的行为 here).

提前致谢。

DateComponentsFormatter 不支持纳秒。

请参阅 allowedUnits 的文档,其中不包括纳秒。它说:

The allowed calendar units are:

  • year
  • month
  • weekOfMonth
  • day
  • hour
  • minute
  • second

Assigning any other calendar units to this property results in an exception.