コード:
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)が必要です。誰かが助けることができれば本当に驚きます。前もって感謝します
文字列から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)")
私は同じ問題を抱えていて、これは私のために働いた
タイムゾーンを設定する必要があります
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」にします
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!)