2015-04-02 41 views
6

代碼:NSDateFormatter返回錯誤的日期+斯威夫特

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數據類型轉換,但沒有得到正確的值。我已經嘗試了很多解決方案,但沒有返回正確的值。我需要yyyy-MM-dd格式(2016-04-02),與我的輸入「2016-04-02」相同。如果有人能夠幫助,那將會真正有幫助。在此先感謝

+0

對不起,我們無法理解您的問題。您在問題中列出的輸出似乎符合您的要求。你能澄清一下嗎? – emrys57 2015-04-02 08:19:06

+0

編號..缺少1天..我的輸入是2016-04-02,但輸出是2016-04-01 – 2015-04-02 11:35:42

+0

[將來返回一個小時的日期](http:// stackoverflow。com/questions/4976530/returns-a-date-an-hour-in-the-future) – 2015-04-02 15:10:44

回答

2

當您從字符串轉換爲NSDate時,如果您不設置時區到格式化程序,您將在本地時區中獲得日期的NSDate。我想你的時區是GMT + 3。

然後,當您顯示'date'(使用println,NSLog但不是NSDateFormatter)的值時,無需設置時區,您將獲得GMT + 0時間。那爲什麼你在3小時後得到了。

取決於如何使用NSDateFormatter,你將有你想要的日期字符串。在你的情況下,它會返回你想要的,不是嗎?

請記住,NSDate存儲值爲GMT + 0時間。

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)") 
+0

我用formatter.timeZone = NSTimeZone(簡稱:「GMT + 3:00」); formatter.locale = NSLocale(localeIdentifier:「en_US_POSIX」)仍然得到2016-04-01 21:00:00 +0000 – 2015-04-02 11:06:52

+0

其實它沒有返回正確的日期..輸入:2016-04-02 - 輸出:2016-04- 01 21:00:00 +0000表示有一天在這裏丟失 – 2015-04-02 11:10:44

+0

由於您的GMT + 3時區是您的時區。正如我所說,NSDateFormatter默認採用我們的本地時區。所以它會給你和沒有指定任何東西一樣的結果。第二件事,有3小時'失蹤',但不是一天。 – 2015-04-02 12:40:00

9

我有同樣的問題,我這個工作對我來說

您需要設置時區

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

我試過但沒有給出正確的返回值。有一天缺少] – 2015-04-02 11:11:17

+0

您是否添加了正確的時區?我是GMT + 0:00,因爲我來自塞浦路斯 – 2015-04-02 11:22:29

+0

是的..我會更新我的問題,更新代碼 – 2015-04-02 11:33:45

4

你的日期是非常好的。 :-)沒有雙關意圖。

我會詳細闡述@HoaParis的回答。

首先NSDate表示一個時刻。這在給定的地方不是日期時間值。因此,代表格林威治午夜的NSDate將在印度上午5點半。

現在來你的問題。當你給出時間格式時,格式化程序會假定它是在夜間。另外,如果沒有提到時區,它將採用當前時區。

因此'2016-04-02'代表'2016-04-02,00:00:00'在您的時區。您的時區是格林威治時間+3,這意味着在您的地點是午夜時刻,它仍然是格林威治的前一天的21:00:00小時,即英國。

正如我們討論的那樣,NSDate是一個時間到了同一個NSDate對象,代表了這兩個看似不同的時代,但實際上它們是同一時刻。

默認情況下打印日期時,它將打印日期而不是時區,即2016-04-01,21:00:00。格式化程序會考慮您的時區並使其'2016-04-02'

2
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!)