Swift 将mysql日期转换为NSDate,然后检查
我在Swift的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
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())
。