2017-07-17 137 views
0

我想將UTC日期轉換爲本地日期而不是本地字符串。我試圖從UTC日期轉換到本地日期(在字符串)再次,然後我試圖從本地日期(字符串)轉換到本地日期。它僅返回UTC日期。我甚至嘗試每次都給時區。什麼都沒有如果有人有想法,我哪裏錯了?UTC日期到當地日期在swift

let dateFormator = DateFormatter() 
dateFormator.dateFormat = inputDateStringFormat 
if fromUTC { 
    dateFormator.timeZone = TimeZone(abbreviation: "UTC") 
} else { 
    dateFormator.timeZone = TimeZone.current 
} 

let resultDate = dateFormator.date(from: inputDateString) 

dateFormator.dateFormat = reqDateStringFormat 
if toUTC { 
    dateFormator.timeZone = TimeZone(abbreviation: "UTC") 
} else { 
    dateFormator.timeZone = TimeZone.current 
} 

guard let dateToConvert = resultDate else { return nil } 
let resultString = dateFormator.string(from: dateToConvert) 

let finalDateFormater = DateFormatter() 
finalDateFormater.dateFormat = reqDateStringFormat 

if toUTC { 
    finalDateFormater.timeZone = TimeZone(abbreviation: "UTC") 
} else { 
    finalDateFormater.timeZone = TimeZone.current 
} 

if let requiredDate = finalDateFormater.date(from: resultString) { 
    return requiredDate 
} else { 
    return nil 
} 

FYC:

  1. toUTC值爲false
  2. inputDateStringFormat爲 「YYYY-MM-DD HH:MM:SS」 從UTC
  3. 爲真
  4. inputDateString是「2017年-07-18 04:45:00「
  5. reqDateStringFormat is」yyyy-MM-dd HH:mm:ss「
+4

'日期'是一個絕對時間點,沒有時區。沒有「UTC日期」或「本地日期」之類的東西。 –

+0

我可以將resultString轉換爲所需的日期格式嗎? – Antony

+1

A * string *有格式,'Date'沒有。 - 請使用您真正需要的信息更新問題。什麼是給定的輸入,什麼是預期的輸出? –

回答

1

由於三個問題的評論已經解釋過,Date沒有時區。 A Date是一個代表絕對時間點的數字(使用牛頓宇宙作爲一個很好的近似值)。如果我的日期(在WET時區)是123.45,那麼在印度的日期也是123.45,即使谷歌告訴我你比我早了5.5個小時。在我的時區問什麼日期等於123.45是沒有意義的,因爲答案是123.45

您應該始終在代碼中內部使用Date。相信我,它會讓你的生活更輕鬆。話雖如此,如果你想向用戶顯示一個日期或從用戶那裏得到一個日期,你不想讓他們在UTC工作,但在他們在(或特定)時區。因此,您在適當的時區使用DateFormatter

如果API或文件格式需要特定的時區格式,請使用日期格式化程序。

如果API需要Unix日期,則可以使用方法timeInterfalSince1970獲取Unix時間。

如果你需要獲得一個ISO日期,使用ISO8601DateFormatter它允許你指定一個時區

FSCalendar

我剛剛有了一個快速瀏覽通過FSCalendar code在Github上,它看起來像它預計NSDate s這是真的和斯威夫特Date s一樣的東西。只要您正確設置了時區,只要提供Date即可。