【问题标题】:DateComponentsFormatter Crash On String From ComponentsDateComponentsFormatter 在来自组件的字符串上崩溃
【发布时间】:2020-04-24 13:05:38
【问题描述】:

我正在从 DateComponentsFormatter 中获取崩溃报告。我无法复制自己,所以如果有人有解决方案或方法来复制它,我将非常感激。

0   CoreFoundation                  0x1a0142a48 __exceptionPreprocess + 220 (NSException.m:199)
1   libobjc.A.dylib                 0x19fe69fa4 objc_exception_throw + 56 (objc-exception.mm:565)
2   Foundation                      0x1a0452e78 -[NSDateComponentsFormatter _canonicalizedDateComponents:withCalendar:usedUnits:withReferenceDate:] + 1436 (NSDateComponentsFormatter.m:101)

我调用它的代码如下所示:

let formatter = DateComponentsFormatter()

// `units` is a user customizable array of NSCalendar.Unit, limited to a subset of [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
formatter.allowedUnits = units

// `style` is a user choosable selection of the DateComponentsFormatter.UnitsStyle enum
formatter.unitsStyle = style

// `components` is a user customizable array of Calendar.Component, limited to a subset of [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
let dateComponents = Calendar.current.dateComponents(components, from: date1, to: date2)

print(formatter.string(from: dateComponents) ?? "")

我没有找到任何会引发此类异常的组合或日期。对这个函数的所有调用都发生在主线程上。

【问题讨论】:

    标签: swift nsdateformatter ios13 nsdatecomponents dateformatter


    【解决方案1】:

    我写了一个小单元测试,它停在一个带有日志的测试断点处:

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

    func test_formatter() {
    
        func randomUnits() -> NSCalendar.Unit {
            let availableUnitsRawValues: [UInt] = [1 << 2, 1 << 3, 1 << 12, 1 << 4, 1 << 5, 1 << 6, 1 << 7] // Corresponding to [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
            let nrUsedUnits = Int.random(in: 1 ... availableUnitsRawValues.count)
            let shuffeledAvailableUnitsRawValues = availableUnitsRawValues.shuffled
            let usedUnitsRawValues = shuffeledAvailableUnitsRawValues[ 0 ..< nrUsedUnits]
            let usedUnitsRawValue = usedUnitsRawValues.reduce(0, |)
            let usedUnits = NSCalendar.Unit.init(rawValue: usedUnitsRawValue)
            return usedUnits
        }
    
        func randomStyle() -> DateComponentsFormatter.UnitsStyle {
            let randomStyleIndex = Int.random(in: 0 ... 5)
            let randomStyle = DateComponentsFormatter.UnitsStyle.init(rawValue: randomStyleIndex)!
            return randomStyle
        }
    
        func randomDate() -> Date {
            let randomDayInterval = Double.random(in: -10 ... 10)
            let randomDate = Date.init(timeIntervalSinceNow: randomDayInterval * 24 * 60 * 60)
            return randomDate
        }
    
        func randomComponents() -> Set<Calendar.Component> {
            let availableComponents: Set<Calendar.Component> = [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
            let nrUsedComponents = Int.random(in: 1 ... availableComponents.count)
            let shuffeledAvailableComponents = Array(availableComponents).shuffled
            let usedComponents = shuffeledAvailableComponents[ 0 ..< nrUsedComponents]
            return Set(usedComponents)
        }
    
    
        for _ in 0 ..< 10 {
            let units = randomUnits()
            for _ in 0 ..< 10 {
                let style = randomStyle()
                for _ in 0 ..< 10 {
                    let components = randomComponents()
                    let formatter = DateComponentsFormatter()
                    // `units` is a user customizable array of NSCalendar.Unit, limited to a subset of [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
                    formatter.allowedUnits = units
                    // `style` is a user choosable selection of the DateComponentsFormatter.UnitsStyle enum
                    formatter.unitsStyle = style
                    // `components` is a user customizable array of Calendar.Component, limited to a subset of [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
                    let dateComponents = Calendar.current.dateComponents(components, 
                                                                                                                             from: randomDate(), 
                                                                                                                             to: randomDate())
                    var yyy = formatter.string(from: dateComponents) ?? "" // Crash here
                }
            }
        }
    }
    

    这里有更多信息:

    【讨论】:

      猜你喜欢
      • 2013-07-12
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 2023-03-25
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多