UTC日期到swift中的本地日期

UTC日期到swift中的本地日期,swift,Swift,我想将UTC日期转换为本地日期,而不是本地字符串。我再次尝试将UTC日期转换为本地日期(字符串),然后尝试将本地日期(字符串)转换为本地日期。它只返回UTC日期。我甚至每次都试着给出时区。什么都不管用。如果有人知道,我错在哪里了 let dateFormator = DateFormatter() dateFormator.dateFormat = inputDateStringFormat if fromUTC { dateFormator.timeZone = TimeZone(ab

我想将UTC日期转换为本地日期,而不是本地字符串。我再次尝试将UTC日期转换为本地日期(字符串),然后尝试将本地日期(字符串)转换为本地日期。它只返回UTC日期。我甚至每次都试着给出时区。什么都不管用。如果有人知道,我错在哪里了

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:

  • toUTC值为false
  • inputDateStringFormat为“yyyy-MM-dd HH:MM:ss”
  • 来自UTC的消息是正确的
  • inputDateString是“2017-07-18 04:45:00”
  • reqDateStringFormat为“yyyy-MM-dd HH:MM:ss”

  • 关于这个问题的三条评论已经解释过,
    日期
    没有时区。日期是一个表示绝对时间点的数字(使用牛顿宇宙作为一个很好的近似值)。如果我的日期(湿时区)是
    123.45
    ,那么你在印度的日期也是
    123.45
    ,即使谷歌告诉我你比我早5.5小时。对于你来说,问我的时区中的哪个日期等于
    123.45
    是没有意义的,因为答案是
    123.45

    您应该始终在代码内部使用
    Date
    s。相信我,这会让你的生活更轻松。话虽如此,如果您想向用户显示日期或从用户处获取日期,您不想让它们在UTC工作,而是在它们所在的时区(或特定的时区)工作。因此,使用带有适当时区的
    日期格式化程序

    如果API或文件格式需要带时区的特定格式,也可以使用日期格式化程序

    如果API需要Unix日期,可以使用方法
    timeInterfalSince1970
    获取Unix时间

    如果您需要获取ISO日期,请使用它来指定时区

    FSCalendar


    我刚刚在Github上快速浏览了一下,它看起来需要
    NSDate
    s,这与Swift
    Date
    s是一样的。只要您正确设置了时区,您只需向它提供
    日期就可以了。

    正如关于这个问题的三条评论已经解释过的那样,
    日期
    没有时区。日期是一个表示绝对时间点的数字(使用牛顿宇宙作为一个很好的近似值)。如果我的日期(湿时区)是
    123.45
    ,那么你在印度的日期也是
    123.45
    ,即使谷歌告诉我你比我早5.5小时。对于你来说,问我的时区中的哪个日期等于
    123.45
    是没有意义的,因为答案是
    123.45

    您应该始终在代码内部使用
    Date
    s。相信我,这会让你的生活更轻松。话虽如此,如果您想向用户显示日期或从用户处获取日期,您不想让它们在UTC工作,而是在它们所在的时区(或特定的时区)工作。因此,使用带有适当时区的
    日期格式化程序

    如果API或文件格式需要带时区的特定格式,也可以使用日期格式化程序

    如果API需要Unix日期,可以使用方法
    timeInterfalSince1970
    获取Unix时间

    如果您需要获取ISO日期,请使用它来指定时区

    FSCalendar


    我刚刚在Github上快速浏览了一下,它看起来需要
    NSDate
    s,这与Swift
    Date
    s是一样的。只要您正确设置了时区,就可以为它提供
    日期
    s。

    A
    日期
    是一个绝对时间点,没有时区。没有“UTC日期”或“本地日期”之类的东西。字符串有格式,
    日期
    没有格式请用您真正需要的信息更新问题。给定的输入是什么,预期的输出是什么?正如Martin R已经提到的,
    Date
    是一个绝对时间点,它没有与之关联的时区。您只能具有相对时间点(特定时区中的日期)的字符串表示形式。告诉我们您真正想要实现什么,然后我们可以提供更多帮助,但从提供的信息来看,不清楚您为什么需要时间表示,以及日期字符串是否足够。回到步骤1:a
    Date
    是绝对时间点,没有时区(打印日期总是使用UTC).我听腻了“日期没有时区…它是UTC”。UTC是一个时区。我想知道“今天”是什么。如果是东部时间1月1日晚上8点以后,我希望“今天”是1月1日。我不只是想展示今天是一月一日。我今天调用的API需要将日期定为1月1日。Date类的一个限制是,唯一的方法是转换为字符串,然后再转换回日期。
    Date
    是一个绝对时间点,没有时区。没有“UTC日期”或“本地日期”之类的东西。字符串有格式,
    日期
    没有格式请用您真正需要的信息更新问题。给定的输入是什么,预期的输出是什么?正如Martin R已经提到的,
    Date
    是一个绝对时间点,它没有与之关联的时区。您只能具有相对时间点(特定时区中的日期)的字符串表示形式。告诉我们您真正想要实现什么,然后我们可以提供更多帮助,但从提供的信息来看,不清楚您为什么需要时间表示,以及日期字符串是否足够。回到步骤1:a
    Date
    是绝对时间点,没有时区(打印日期总是使用UTC).我听腻了“日期没有时区…它是UTC”。UTC是一个时区。我想知道“今天”是什么。如果是