Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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
Ios 日期选择器显示与拾取日期不同的日期(1天之后)_Ios_Swift_Date_Nsdate_Nsdateformatter - Fatal编程技术网

Ios 日期选择器显示与拾取日期不同的日期(1天之后)

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

我有一个连接到UILabel的UIDatePicker。我希望用户选择一个18年前的生日(年龄限制)。因此,我用这一行设置
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时间