【问题标题】:NSDateFormatter to Int in SwiftNSDateFormatter 到 Swift 中的 Int
【发布时间】:2015-04-27 11:44:31
【问题描述】:

我正在尝试转换 NSDateFormater Int,但变量返回 nil。 这是我正在使用的代码:

    var datePeriodBegin:NSDate = NSDate()    
    if(NSUserDefaults.standardUserDefaults().objectForKey("datePeriodBegin") != nil){
        datePeriodBegin = (NSUserDefaults.standardUserDefaults().objectForKey("datePeriodBegin")! as? NSDate)!
    }

    let datePeriodEnd = NSCalendar.currentCalendar().dateByAddingUnit(NSCalendarUnit.CalendarUnitMonth, value: 6, toDate: datePeriodBegin, options: nil)!


    var dateFormatter: NSDateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyyMMdd000000"

    var start:Int = dateFormatter.stringFromDate(datePeriodBegin).toInt()!
    var end:Int = dateFormatter.stringFromDate(datePeriodEnd).toInt()!

    println(start) // return nil in iPhone 4S -> iPhone 5s

【问题讨论】:

  • 当你只在设备上运行它时它返回nil?因为我刚刚将它粘贴到 Playground 中,并且 它可以工作
  • 还可以确认它对我有用,就像在操场上写的那样。
  • 如果平台使用 32 位 Int,您的代码是不安全的,因为您要超过 Int32.max。无论如何,以另一种方式进行计算可能会更安全。也许使用明确的日期组件和 64 位 Int。

标签: swift int nsdate


【解决方案1】:

您的日期不适合Int32。 iPhone 4s 是 32 位,iPhone 5s 应该是 64 位。

【讨论】:

    【解决方案2】:

    Yene 是绝对正确的,如果你真的需要最后所有这些零,那么在 32 位设备上你需要先转换为 Int64:

      var datePeriodBegin:NSDate = NSDate()
            if(NSUserDefaults.standardUserDefaults().objectForKey("datePeriodBegin") != nil){
                datePeriodBegin = (NSUserDefaults.standardUserDefaults().objectForKey("datePeriodBegin")! as? NSDate)!
            }
    
            let datePeriodEnd = NSCalendar.currentCalendar().dateByAddingUnit(NSCalendarUnit.CalendarUnitMonth, value: 6, toDate: datePeriodBegin, options: nil)!
    
    
            var dateFormatter: NSDateFormatter = NSDateFormatter()
            dateFormatter.dateFormat = "yyyyMMdd"
    
            var start = dateFormatter.stringFromDate(datePeriodBegin).toInt()
            var end = dateFormatter.stringFromDate(datePeriodEnd).toInt()
    
            if let s = start {
                println(Int64(s)*1000000) // return 20150427000000 iPhone 4S -> iPhone 5
            }
    

    在 32 位设备上,Int 的最大值与 Int32 相同,即 2147483647,而 Int64 的最大值为 9223372036854775807(与 64 位设备上的 Int 相同)。

    更新:iOS 9、Xcode 7

    该代码不再适用于当前版本的 Xcode 和 Swift - 这是为 iOS 9、Xcode 7 重写的工作代码:

    var datePeriodBegin:NSDate = NSDate()
    if(NSUserDefaults.standardUserDefaults().objectForKey("datePeriodBegin") != nil){
        datePeriodBegin = (NSUserDefaults.standardUserDefaults().objectForKey("datePeriodBegin")! as? NSDate)!
    }
    
    let datePeriodEnd = NSCalendar.currentCalendar().dateByAddingUnit(NSCalendarUnit.Month, value: 6, toDate: datePeriodBegin, options: [])!
    
    
    var dateFormatter: NSDateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyyMMdd"
    
    var start = Int(dateFormatter.stringFromDate(datePeriodBegin))
    var end = Int(dateFormatter.stringFromDate(datePeriodEnd))
    
    if let s = start {
        print(Int64(s)*1000000) // return 20150427000000 iPhone 4S -> iPhone 5
    }
    

    如果它在 Xcode/Swift/iOS 的未来版本中出现问题,请发表评论,我会更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      相关资源
      最近更新 更多