Ios 日期选择器显示与拾取日期不同的日期(1天之后)
我有一个连接到UILabel的UIDatePicker。我希望用户选择一个18年前的生日(年龄限制)。因此,我用这一行设置Ios 日期选择器显示与拾取日期不同的日期(1天之后),ios,swift,date,nsdate,nsdateformatter,Ios,Swift,Date,Nsdate,Nsdateformatter,我有一个连接到UILabel的UIDatePicker。我希望用户选择一个18年前的生日(年龄限制)。因此,我用这一行设置maximumDate值: datePicker.maximumDate = NSCalendar.currentCalendar().dateByAddingUnit(.Year, value: -18, toDate: NSDate(), options: []) 但是,此行会导致选择器显示所选日期后1天。例如,如果我在选择器上选择1956年9月27日,标签上会显示19
maximumDate
值:
datePicker.maximumDate = NSCalendar.currentCalendar().dateByAddingUnit(.Year, value: -18, toDate: NSDate(), options: [])
但是,此行会导致选择器显示所选日期后1天。例如,如果我在选择器上选择1956年9月27日,标签上会显示1956年9月26日,我认为这与使用本地时区后面的另一个时区有关
switch dequeueFrom[indexPath.row] {
case .Birthday:
if let pickedBday = pickedBday,
let bday = NSDate.dateFromISOString(pickedBday) {
(cell as! RegisterTextFieldCell).content(bday.longFormattedString())
}
//dateFromISOSString在扩展名中声明。swift
class func dateFromComponents(components: NSDateComponents) -> NSDate? {
let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)
return calendar?.dateFromComponents(components)
}
class func dateFromString(string: String) -> NSDate? {
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss-SSS"
if let stringDate = dateFormatter.dateFromString(string) {
return stringDate
} else {
return nil
}
}
func ISOStringFromDate() -> String {
let dateFormatter = NSDateFormatter()
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"
return dateFormatter.stringFromDate(self).stringByAppendingString("Z")
}
class func dateFromISOString(string: String) -> NSDate? {
let dateFormatter = NSDateFormatter()
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
if let stringDate = dateFormatter.dateFromString(string) {
return stringDate
} else {
return nil
}
}
关于如何使NSDate()成为我的本地时区,从而消除这一落后一天的问题,有什么帮助吗?非常感谢您的帮助:)问题在于您的方法ISOStringFromDate,因为您正在获取本地时间并手动将Z(Z表示UTC)添加到字符串中。创建iso8601时,请尝试以下操作:
extension NSDate {
var iso8601: String {
let dateFormatter = NSDateFormatter()
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
dateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
return dateFormatter.stringFromDate(self)
}
}
您的代码应该是:
pickedDate.iso8601 // to get your date iso8601 string
问题出在方法ISOStringFromDate中,因为您要获取本地时间并手动将Z(Z表示UTC)添加到字符串中。创建iso8601时,请尝试以下操作:
extension NSDate {
var iso8601: String {
let dateFormatter = NSDateFormatter()
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
dateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
return dateFormatter.stringFromDate(self)
}
}
您的代码应该是:
pickedDate.iso8601 // to get your date iso8601 string
您需要用相关代码更新您的问题。@rmaddy相关代码是什么意思?这是在日期选择器上设置“年龄限制”的一行。设置标签的代码将是一个很好的开始,因为这正是您遇到问题的地方。@rmaddy标签的可能副本只显示日期选择器的日期,就是它,如果我注释掉行
datePicker.maximum=NSCalendar….
标签将显示正确的日期。您需要用相关代码更新您的问题。@rmaddy相关代码是什么意思?这是在日期选择器上设置“年龄限制”的一行。设置标签的代码将是一个很好的开始,因为这正是您遇到问题的地方。@rmaddy标签的可能副本只显示日期选择器的日期,就是它,如果我注释掉行datePicker.maximum=NSCalendar….
标签将显示正确的日期。还要确保在显示它时,您没有在日期格式上设置UTC时间,也确保在显示它时,您没有在日期格式上设置UTC时间