web-dev-qa-db-ja.com

NSDateFormatterが誤った日付を返す+ Swift

コード:

let dateString = "2016-04-02"
    var formatter: NSDateFormatter = NSDateFormatter()
    formatter.timeZone = NSTimeZone(abbreviation: "GMT +3:00")
    formatter.dateFormat = "yyyy-MM-dd"
    println("dateString: \(dateString)")
    formatter.locale =  NSLocale(localeIdentifier: "en_US_POSIX")
    let date = formatter.dateFromString(dateString)
    println("date: \(date)")

    formatter.dateFormat = "yyyy-MM-dd"
    let formattedDateString = formatter.stringFromDate(date!)
    println("formattedDateString: \(formattedDateString)")

出力:

dateString: 2016-04-02
date: Optional(2016-04-01 21:00:00 +0000)
formattedDateString: 2016-04-02
2016-04-01 21:00:00 +0000

文字列をNSDateデータ型に変換しようとしていますが、正しい値を取得できません。私は多くの解決策を試しましたが、正しい値を返しません。入力「2016-04-02」と同じyyyy-MM-dd形式(2016-04-02)が必要です。誰かが助けることができれば本当に驚きます。前もって感謝します

13
Sanjay Kumar

文字列からNSDateに変換する場合、フォーマッタにタイムゾーンを設定しないと、ローカルタイムゾーンの日付のNSDateが取得されます。あなたのタイムゾーンはGMT + 3だと思います。

次に、タイムゾーンを設定せずに「date」の値を表示すると(println、NSLogを使用してNSDateFormatterを使用しない)、GMT + 0の時間を取得します。そのため、3時間後に取得します。

NSDateFormatterの使用方法によっては、必要に応じて日付文字列を取得できます。あなたの場合、それはあなたが望むものを返しますね?

NSDateは瞬間を表すことを覚えておいてください。

let dateString = "2016-04-02"
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
println("dateString: \(dateString)")

formatter.locale =  NSLocale(localeIdentifier: "en_US_POSIX")
let date = formatter.dateFromString(dateString) //without specify timezone, your dateString "2016-04-02" is your local time (GMT-3),  
//means it's 2016-04-02 00:00:000 at GMT+0. That is the value that NSDate holds.

println("date: \(date)") //that why it show 2016-04-01 21:00:000, but not 2016-04-02 00:00:000

formatter.dateFormat = "yyyy-MM-dd"
let formattedDateString = formatter.stringFromDate(date!)
println("formattedDateString: \(formattedDateString)")
5
Duyen-Hoa

私は同じ問題を抱えていて、これは私のために働いた

タイムゾーンを設定する必要があります

formatter.timeZone = NSTimeZone(abbreviation: "GMT+0:00")

あなたの日付は完全に良いです。 :-)しゃれは意図されていません。

@HoaParisの回答について詳しく説明します。

まず、NSDateは瞬間を表します。指定された場所の日時値ではありません。したがって、グリニッジの真夜中を表すNSDateは、インドでは午前5時30分になります。

今あなたの質問に来ています。時間のない日付形式を指定すると、フォーマッターはそれを真夜中と見なします。また、タイムゾーンが指定されていない場合は、現在のタイムゾーンが使用されます。

したがって、「2016-04-02」は、タイムゾーンでの「2016-04-02、00:00:00」を表します。あなたのタイムゾーンはGMT + 3です。つまり、あなたの場所が真夜中であっても、グリニッジ、つまり英国では前日の21:00:00時のままです。

NSDateについて説明したように、NSDateオブジェクトは、同じNSDateオブジェクトがこれらの2つの異なる時間を表しますが、実際には同じ時間です。

デフォルトで日付を印刷すると、タイムゾーンではなく、GMTを基準に日付が印刷されます(2016-04-01、21:00:00など)。フォーマッターは、タイムゾーンを考慮して「2016-04-02」にします

5
Abdullah
let dateFormatter = DateFormatter()
  //Your current Date Format 
  dateFormatter.dateFormat = "yyyy-MM-dd"
  dateFormatter.locale = Locale(identifier: "en_US_POSIX")
  dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
  let finaldate = dateFormatter.date(from:"Your String")

  //Your changing Date Format 
  dateFormatter.dateFormat = "MMM-dd"
  let second = dateFormatter.string(from: finaldate!)
4
MK_iOS