将 mysql 日期转换为 NSDate 然后检查之间有多少天

Convert a mysql date to NSDate then check how many days between

我在 Swift 中遇到 NSDate 问题。

  1. 我 JSON 我的数据库中 Y-m-d 格式的日期。这被存储为一个名为 survey_date
  2. 的字符串
  3. 然后我使用 dateFormatter
  4. 将字符串转换为 NSDate
  5. 我想计算 survey_date 和现在
  6. 之间的天数

我的脚本中的错误是 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() 是用 date 而不是 string 调用的, 这毫无意义。

你的计算有点复杂,可以缩短为

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() with 第二个日期格式化程序,例如

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

这里有一些您可能会觉得方便的东西。我正在开发一个应用程序,该应用程序会进行大量日期计算,因此需要多次调用 NSCalendar' s components(_:fromDate:toDate:options:) 方法。这感觉不太像 Swift,所以我重载了 - 运算符来执行日期减法:

func -(lhs: NSDate, rhs: NSDate) -> NSDateComponents
{
  let components: NSCalendarUnit =
    .CalendarUnitSecond |
    .CalendarUnitMinute |
    .CalendarUnitHour   |
    .CalendarUnitDay
  return NSCalendar.currentCalendar().components(components,
    fromDate: rhs,
    toDate: lhs,
    options: nil)
}

这让您可以通过简单的减法找到任意两个 dates/times 之间的差异。这是一个简单的例子:

// 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