Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS 8.4和9.3版本中,NSDate在小于5s的模拟器上崩溃_Ios_Swift_Nsdate - Fatal编程技术网

在iOS 8.4和9.3版本中,NSDate在小于5s的模拟器上崩溃

在iOS 8.4和9.3版本中,NSDate在小于5s的模拟器上崩溃,ios,swift,nsdate,Ios,Swift,Nsdate,我有一个奇怪的错误,我的应用程序会在所有模拟器上崩溃,而不是iPhone 5s 首先,我尝试重置所有模拟器,但崩溃仍然存在 代码 错误 第二个函数中的最后一行代码: cal.dateByAddingComponents(comp,toDate:self.firstDayOfMonth()!选项:[]) 在发生崩溃的设备上返回5828963-12-20 00:00:00+0000 再现错误 在iPhone4S(v8.4,v9.3)和iPhone5(v8.4,v9.3)上运行时,我能够始终如一地

我有一个奇怪的错误,我的应用程序会在所有模拟器上崩溃,而不是iPhone 5s

首先,我尝试重置所有模拟器,但崩溃仍然存在

代码
错误 第二个函数中的最后一行代码:
cal.dateByAddingComponents(comp,toDate:self.firstDayOfMonth()!选项:[])
在发生崩溃的设备上返回
5828963-12-20 00:00:00+0000


再现错误 在iPhone4S(v8.4,v9.3)和iPhone5(v8.4,v9.3)上运行时,我能够始终如一地重现该问题,但该错误不会出现在操场上,也不会出现在iPhone5s或iPhone6/6s上


任何帮助都将不胜感激。

这可能是由于整数溢出造成的
iphone5s及以上版本使用
64位
处理器,以下版本使用
32位
。使用
dateFromComponents
,查看此apple文档,了解不同日期之间的差异

不要使用此方法比较第二个差异,因为它会在32位平台上溢出NSInteger

避免崩溃的可能解决方案

  • 尝试从日期比较中删除秒数

请尝试此替代日期数学

extension NSDate {

  func firstDayOfMonth() -> NSDate {

    let calendar = NSCalendar.currentCalendar()
    var startDate : NSDate?
    calendar.rangeOfUnit(.Month, startDate: &startDate, interval: nil, forDate: self)
    let components = calendar.components([.Year, .Month, .Day], fromDate: startDate!)
    components.hour = 12
    return calendar.dateFromComponents(components)!
  }

  func lastDayOfMonth() -> NSDate {

    let calendar = NSCalendar.currentCalendar()
    let dayRange = calendar.rangeOfUnit(.Day, inUnit: .Month, forDate: self)
    let dayLength = dayRange.length
    let components = calendar.components([.Year, .Month, .Day], fromDate: self)
    components.day = dayLength
    components.hour = 12
    return calendar.dateFromComponents(components)!
  }
}
Swift 3

extension Date {

    func firstDateOfMonth() -> Date {

        let calendar = Calendar.current
        var startDate = Date()
        var interval : TimeInterval = 0
        _ = calendar.dateInterval(of:.month, start: &startDate, interval: &interval, for: self)
        return startDate
    }

    func lastDateOfMonth() -> Date {

        let calendar = Calendar.current
        let dayRange = calendar.range(of:.day, in: .month, for: self)!
        let dayLength = dayRange.upperBound
        var components = calendar.dateComponents([.year, .month, .day], from: self)
        components.day = dayLength
        return calendar.date(from:components)!
    }
}

将小时设置为12可能很有用,尤其是在巴西,其中一个夏令时从0:00跳到0:59。

我已经删除了秒,恐怕运气不好。我会查看链接的,谢谢!
extension Date {

    func firstDateOfMonth() -> Date {

        let calendar = Calendar.current
        var startDate = Date()
        var interval : TimeInterval = 0
        _ = calendar.dateInterval(of:.month, start: &startDate, interval: &interval, for: self)
        return startDate
    }

    func lastDateOfMonth() -> Date {

        let calendar = Calendar.current
        let dayRange = calendar.range(of:.day, in: .month, for: self)!
        let dayLength = dayRange.upperBound
        var components = calendar.dateComponents([.year, .month, .day], from: self)
        components.day = dayLength
        return calendar.date(from:components)!
    }
}