2016-12-04 86 views
3

嘗試將「2016-06-23 12:00:00」轉換爲UTC日期時我收到「2016-06-23 10:00:00」在Swift中將日期從GMT + 1轉換爲UTC時出現混亂

第一個日期是在GMT + 1,我想要轉換爲UTC。如果我沒有誤認爲GMT + 0 == UTC,那麼12:00應該是11:00?但我總是得到10:00。爲什麼是這種情況,我如何正確轉換它?

我都在操場上和實際設備

在嘗試這樣做這是我使用的代碼:

class ViewController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    let datestring:String = "2016-06-23 12:00:00" 

    print("1: "+datestring) 

    print("2: "+convertDateToUTC(datestring)) 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func convertDateToUTC(_ datestring:String) -> String { 

    let dateForm = DateFormatter() 
    dateForm.dateFormat = "yyyy-MM-dd HH:mm:ss" 
    dateForm.timeZone = TimeZone(abbreviation: "GMT+1") 

    print(TimeZone.current.abbreviation()!) 

    let date = dateForm.date(from: datestring) 

    dateForm.timeZone = TimeZone(abbreviation: "UTC") 

    let date1 = dateForm.string(from: date!) 

    return date1 

} 

} 

輸出:

1: 2016-06-23 12:00:00 
GMT+1 
2: 2016-06-23 10:00:00 

回答

4

簡短的回答:更換"GMT+1"通過"GMT+01"

"GMT+1"是不是一個有效的時區縮寫:

let tz = TimeZone(abbreviation: "GMT+1") 
print(tz) // nil 

因此,在

dateForm.timeZone = TimeZone(abbreviation: "GMT+1") 

設置dateForm.timeZonenil,這意味着日期 字符串在默認解釋(本地) 時區。

隨着

dateForm.timeZone = TimeZone(abbreviation: "GMT+01") 

你會得到預期的結果。

dateForm.timeZone = TimeZone(secondsFromGMT: 3600) 
dateForm.timeZone = TimeZone(identifier: "GMT+0100") 

補遺(響應於您的註釋)::另外,從(數字)GMT的偏移或從它的標識符創建的時區

TimeZone(identifier: "GMT+0100") 
TimeZone(identifier: "Europe/Berlin") 

不同時區。第一個使用一個小時的固定格林威治時間偏移量,第二個是一個地區(在本例中爲德國)的時區, ,與UTC時間相差一兩個小時,具體取決於夏令時是否爲 在指定的日期。

+0

謝謝,這確實使它的工作!令我困惑的是TimeZone.current.abbreviation()!給我GMT + 1,而不是GMT + 01 ... 當我現在把TimeZone(縮寫:TimeZone.current.abbreviation()!)它不會再工作,我該怎麼辦? – abcdefg

+0

啊哈。 :)))))))))我認爲我們也應該建議他看看什麼時區_is_而不是僅僅做一個假設。 – matt

+2

@abcdefg最好不要從時區縮寫中創建時區。正如你所看到的,它並不總是工作。另外還有重複的縮寫和大量無效的縮寫。總是使用'identifier'或'secondsFromGMT'初始化器來避免這些問題。 – rmaddy