2016-09-18 6 views
1

で私は、次のコードを実行しています:たDateFormatter変更日500年

if let messagedate = curr_comment["timestamp"] as? String { 
     let dateFormatter = NSDateFormatter() 
     dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" 
     let date = dateFormatter.dateFromString(messagedate) 
} 

、ここでは、デバッガの出力である:

enter image description here

これは今日、ランダムに起こって始めた、私はわからないんだけどこのような簡単な操作によって、なぜ500年の日付が変わるのか。

EDIT:これは、仏教のカレンダーを使用しているデバイスで発生します。

+0

問題のデバイスの 'locale'がグレゴリオ暦のために設定されていないことは間違いありません。この 'yyyy-MM-dd HH:mm:SS'フォーマットが内部目的(データベースへの保存、Webサービスとの通信など)である場合、フォーマッタの' locale'を 'en_US_POSIX'に設定することを検討するべきです。 [Technical Q&A 1480](https://developer.apple.com/library/content/qa/qa1480/_index.html)を参照してください。 – Rob

+0

これは、appDelegateのアプリ全体に対してグローバルに行うことができるものか、アプリ内で使用するすべてのdateFormatterに対して行うべきことですか? – Alk

+0

基本的に、メッセージ/コメントが他のユーザーに投稿されたアプリ – Alk

答えて

2

グレゴリオ暦に該当するデバイスが設定されていないためです。それは仏教のカレンダーを使用しています。国際的なカレンダーを正常に処理するための日付文字列の適切な処理については、Apple Technical Q&A 1480を参照してください。

このyyyy-MM-dd HH:mm:ss形式が内部目的(データベースに保存する、Webサービスと通信するなど)の場合は、フォーマッタのロケールをen_US_POSIXに設定することを検討する必要があります。スウィフト2で

dateFormatter.locale = Locale(identifier: "en_US_POSIX") 

:スウィフト3では

dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 

率直に言って、これはまた、日付の文字列表現が使用しているタイムゾーンについての質問を頼みます。通常、日付/時刻文字列がUTC/GMTで一貫して格納されていることを確認する必要があります。スウィフト3:

dateFormatter.timeZone = TimeZone(secondsFromGMT: 0) 

あるいは、スウィフト2:

dateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) 

あなたは一貫アプリを通じて、あなたは奇妙なタイムゾーンの問題を避けるだろうことを行う場合(例えばもし今、NYポスト何かの誰か3時間前に起こったことをCAで教えてもらいたい)

+0

どうやって仏教徒だと分かったのですか? – Honey

+1

私は騙されました。違うカレンダーが問題だったと私がOPに指摘したとき、彼は仏教のカレンダーを使って友人の装置で問題が起こったことを教えてくれました。しかしこれは、さまざまな非グレゴリオ暦で起こるよく知られた問題です。特に、仏教のカレンダーについては、特に 'en_US_POSIX'の'ロケール 'を使用しないという一般的な問題よりも心配はありません。 – Rob

関連する問題