日期选择器显示与拾取时不同的日期(1天内)

时间:2016-09-09 05:19:43

标签: ios swift date nsdate nsdateformatter

我有一个连接到UILabel的UIDatePicker。我希望用户选择一个超过18年的生日(年龄限制)。所以我有这一行来设置maximumDate值:

datePicker.maximumDate = NSCalendar.currentCalendar().dateByAddingUnit(.Year, value: -18, toDate: NSDate(), options: [])

然而,此行会导致选择器显示所选日期后1天。例如,如果我在选择器上选择September 27, 1956,标签会显示September 26, 1956我认为它与使用我当地时区背后的不同时区的NSDate()有关。

switch dequeueFrom[indexPath.row] {
    case .Birthday:
        if let pickedBday = pickedBday,
        let bday = NSDate.dateFromISOString(pickedBday) {
            (cell as! RegisterTextFieldCell).content(bday.longFormattedString())
        }

// dateFromISOSString is declared in an extension.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()的帮助都是我当地的时区,所以这一天落后的问题可以消失?非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:2)

问题在于您的方法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