web-dev-qa-db-ja.com

iOS Swift 3:「yyyy-MM-dd'T'HH:mm:ssZ」フォーマット文字列を日付オブジェクトに変換

こんにちは辞書があります

self.publishedAt = dictionary["publishedAt"] as? NSString

私は日付を取得しています "2017-01-27T18:36:36Z"。読み取り可能な形式に変換したい:dd-MM-yyyy hh:mm:ss。経由してみた

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy hh:mm:ss"
let date = dateFormatter.date(from: (self.publishedAt as? String)!)
print("EXACT_DATE : \(date)") 

しかし、ゼロになる。 :(

簡単な形式で日付を取得する正しい方法は何ですか?

14

ISO8601文字列を日付に変換する入力形式と、日付を文字列に戻す出力形式が必要です。

let string = "2017-01-27T18:36:36Z"

let dateFormatter = DateFormatter()
let tempLocale = dateFormatter.locale // save locale temporarily
dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
let date = dateFormatter.date(from: string)!
dateFormatter.dateFormat = "dd-MM-yyyy HH:mm:ss"
dateFormatter.locale = tempLocale // reset the locale
let dateString = dateFormatter.string(from: date)
print("EXACT_DATE : \(dateString)")
38
vadian

文字列をDateオブジェクトに変換するには:

let string = "2017-01-27T18:36:36Z"
let isoFormatter = ISO8601DateFormatter()
let date = isoFormatter.date(from: string)!

または、以前のiOSバージョンをサポートする必要がある場合 ISO8601DateFormatter

let isoFormatter = DateFormatter()
isoFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssX"
isoFormatter.locale = Locale(identifier: "en_US_POSIX")
isoFormatter.timeZone = TimeZone(secondsFromGMT: 0)
let date = isoFormatter.date(from: string)!

(ISO 8601日付フォーマッタにlocaleを設定した理由を理解するには、 Apple Technical Q&A 148 を参照してください。)

次に、それをユーザーフレンドリな日付形式に変換するには、別のフォーマッターを使用します(または上記の2番目の例を使用すると、フォーマッターを再使用できますが、localeを忘れずにリセットしてくださいLocale.current):

let formatter = DateFormatter()
formatter.dateStyle = .short
formatter.timeStyle = .medium
let result = formatter.string(from:date)

注:dateFormat文字列ではなく、日付をユーザーに返すときにこれらのスタイルパラメーターを使用することをお勧めします。したがって、24時間制が必要かどうかを想定するのではなく、ロケールに適したスタイルを使用すること、および/またはdd-MM-yyyy vs MM-dd-yyyy形式を使用するかどうか。


日付フォーマッターの形式の変更(たとえば、dateFormat文字列の変更)は比較的高価なプロセスであるため、複数の日付に対してこのプロセスを実行する場合、単一のDateFormatterdateFormatまたはスタイルを絶えず繰り返し変更します(さらに悪いことに、日付ごとに新しいフォーマッターをインスタンス化します)。代わりに、日付形式スタイルごとに1つのフォーマッタを作成し、可能な限り文法を再利用します。

15
Rob