UTC日期到当地日期在swift

问题描述:

我想将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'没有。 - 请使用您真正需要的信息更新问题。什么是给定的输入,什么是预期的输出? –

由于三个问题的评论已经解释过,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即可。