Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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
Swift 将mysql日期转换为NSDate,然后检查_Swift_Cocoa_Date_Nsdate - Fatal编程技术网

Swift 将mysql日期转换为NSDate,然后检查

Swift 将mysql日期转换为NSDate,然后检查,swift,cocoa,date,nsdate,Swift,Cocoa,Date,Nsdate,我在Swift的NSDate中遇到问题 我从数据库中获取了一个Y-m-d格式的日期。这将存储为名为survey_date的字符串 然后,我使用dateFormatter将字符串转换为NSDate 我想算出从调查日期到现在的天数 脚本中的错误是endDate是不明确的表达式,没有更多上下文 这是我的剧本: var survey_date = prefs.valueForKey("SURVEY_DATE") as! String let dateFormatter = NSDate

我在Swift的NSDate中遇到问题

  • 我从数据库中获取了一个Y-m-d格式的日期。这将存储为名为survey_date的字符串
  • 然后,我使用dateFormatter将字符串转换为NSDate
  • 我想算出从调查日期到现在的天数
  • 脚本中的错误是endDate是不明确的表达式,没有更多上下文

    这是我的剧本:

    var survey_date = prefs.valueForKey("SURVEY_DATE") as! String
    
            let dateFormatter = NSDateFormatter()
            dateFormatter.dateFormat = "yyyy-MM-dd"
            var date = dateFormatter.dateFromString(survey_date) as NSDate!
            let outputDate = dateFormatter.stringFromDate(date)
    
            println(outputDate)
    
            let start = outputDate
            let end = NSDate()
    
            let dateFormatter2 = NSDateFormatter()
            dateFormatter2.dateFormat = "yyyy-MM-dd"
    
            let startDate:NSDate = dateFormatter2.dateFromString(start)!
            let endDate:NSDate = dateFormatter2.dateFromString(end)!
    
            let cal = NSCalendar.currentCalendar()
    
            let unit:NSCalendarUnit = .CalendarUnitDay
    
            let components = cal.components(unit, fromDate: startDate, toDate: endDate, options: nil)
    
            println(components)
    

    其次,我还希望能够在可能的情况下将日期转换为不同的格式-例如d m,Y。这在PHP中非常简单,但我找不到在Swift中实现的方法?我不想通过JSON发送额外的数据(即创建一个$formatted_date),但这似乎是我唯一的选择(我知道这很混乱,我会因此而被训斥!)

    你会发现一个编译器错误

    let endDate:NSDate = dateFormatter2.dateFromString(end)!
    
    因为调用
    dateFromString()
    时使用的是日期而不是字符串, 这毫无意义

    你的计算有点太复杂了,你可以把它缩短到

    let survey_date = "2015-05-01"
    
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    if let startDate = dateFormatter.dateFromString(survey_date) {
        let endDate = NSDate()
        let cal = NSCalendar.currentCalendar()
        let components = cal.components(.CalendarUnitDay, fromDate: startDate, toDate: endDate, options: nil)
        let days = components.day
        println(days)
    
    } else {
        println("invalid input")
    }
    
    如果要将日期转换为其他格式,则 (正如Leo在评论中所说的),将
    stringFromDate()
    与 第二个日期格式化程序,例如

    let dateFormatter2 = NSDateFormatter()
    dateFormatter2.dateFormat = "d MM, Y"
    let formattedStartDate = dateFormatter2.stringFromDate(startDate)
    println(formattedStartDate)
    

    这里有一些你可能会觉得很方便的东西。我正在开发一个应用程序,该应用程序进行了大量的日期计算,因此对
    NSCalendar
    组件(u:fromDate:toDate:options:)
    方法进行了大量调用。这感觉不是很快,所以我重载了
    -
    操作符来执行日期减法:

    func -(lhs: NSDate, rhs: NSDate) -> NSDateComponents
    {
      let components: NSCalendarUnit =
        .CalendarUnitSecond |
        .CalendarUnitMinute |
        .CalendarUnitHour   |
        .CalendarUnitDay
      return NSCalendar.currentCalendar().components(components,
        fromDate: rhs,
        toDate: lhs,
        options: nil)
    }
    
    这使您可以通过简单的减法找到任意两个日期/时间之间的差异。下面是一个简单的例子:

    // MySQL date formatter
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    
    // Let's create a couple of dates that we know are one day apart
    let christmas2015 = dateFormatter.dateFromString("2015-12-25")!
    let christmasEve2015 = dateFormatter.dateFromString("2015-12-24")!
    
    let difference = christmas2015 - christmasEve2015
    let daysBetween = difference.day // this value is 1
    

    您需要两个日期格式化程序,一个用于读取输入字符串,另一个用于将日期对象转换为使用不同格式的字符串。谢谢!工作完美。我现在有另一个问题,我从mysql的日期是2015-27-05(GMT+1时区-BST),输出为2015-05-26 23:00:00+0000。我如何才能纠正这个问题?当时区发生变化时,问题会在今年晚些时候出现吗?@tomatford:NSDate代表一个绝对时间点,没有时区。打印NSDate总是以GMT显示值。在您的情况下,GMT+1中的
    2015-27-05
    2015-05-26 23:00:00+0000
    的时间点相同。简而言之:一切正常。这会影响天数计算-我的日期2015-27-05被解释为2015-26-05,因此我的天数应该是5,而我的天数应该是6。为了避免时区混淆,
    NSDate
    始终将其值存储为GMT日期/时间;您必须使用
    NSDateFormatter
    及其
    timeZone
    属性来显示指定时区的日期和时间。在许多情况下,使用当前日历的时区(由用户的设置确定)应该有效:
    dateFormatter.timeZone=NSCalendar.currentCalendar().timeZone
    @tomatford:它不应该影响计算,因为所有日历计算(例如
    cal.components(…)
    )默认情况下,在您的本地时区完成但是,如果开始日期是
    NSDate()
    ,那么问题是差异是从当前日期+时间(例如今天上午11点)计算出来的,您可能希望
    让startDate=cal.startOfDayForDate(NSDate())