2016-09-09 14 views
0

私はUILateに接続しているUIDatePickerを持っています。私は18歳以上の誕生日(年齢制限)を選択するようにします。だから私は、maximumDate値を設定するには、この行います日付ピッカーは、選択したときとは異なる日付(1日間)を表示します

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

私は問題の背後に、この1日が離れて行くことができるようにNSDateは()私のローカルタイムゾーンも作ることができる方法で任意のヘルプ?任意のヘルプは非常に高く評価されています:)

+1

あなたはあなたの質問は、該当するコードを更新する必要があります。 – rmaddy

+0

@rmaddy関連するコードはどういう意味ですか?これはdatePickerの「年齢制限」を設定している1行です – ioskaveen

+0

ラベルを設定するコードは、問題が発生している場所であるため、すばらしいスタートになります。 – rmaddy

答えて

2

ローカル時間を取得し、手動でZ(ZはUTCを意味する)を文字列に追加するため、ISOStringFromDateメソッドに問題があります。あなたの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 
+0

をアップロードしていることを確認してくださいあなたはあなたの日付フォーマッタでUTCの時間を設定していないことを確認してください –

+0

大丈夫です!そしてそれは動作します! – ioskaveen

+0

あなたは大歓迎です –

関連する問題