首页 文章

DateFormatter返回Timezone的意外日期

提问于
浏览
1

我已经阅读了多篇关于此的帖子,大多数是由于没有设置特定的时区而系统获得当前时区 . 我的情况略有不同,并给出了意想不到的结果,所以我将尝试详细解释 .

我正在处理一个后端,它返回分为日期和时间的日期,存储为整数值 . 例如,返回值可能是 131006 ,这将转换为 13:10:06 . 我知道这个后端总是返回 UTC 中的日期 . 我将其转换为String并使用以下代码将String转换为Date:

let timeFormatter = DateFormatter()
timeFormatter.dateFormat = "HHmmss"
timeFormatter.timeZone = TimeZone(identifier: "UTC")
let time = timeFormatter.date(from: "131006")

为了做一些检查,我在这段代码中写了一些print语句 . 这里最重要的是 print(timeFormatter.timeZone.abbreviation()) ,返回 Optional("GMT") . 这是好的,正如预期的那样,因为GMT == UTC . 我还检查了time的值,它返回 2000-01-01 13:10:06 +0000 ,这仍然是预期的结果 .

现在转到代码,然后使用所需的TimeZone将该日期格式化为所需的String:

let timeToString = DateFormatter()
timeToString.dateFormat = "HH:mm"
timeToString.timeZone = TimeZone.current
let timeString = timeToString.string(from: time!)

在此代码中,我还打印 TimeZone.current.abbreviation()) 属性,该属性返回 Optional("GMT+2") ,这也是预期的结果 . 但是,当我们打印 timeString 变量的值时,输出为 14:10 ,而不是 15:10 的预期结果 .

我使用DateFormatter的方式有什么问题?谢谢!

1 回答

  • 3

    let timeFormatter = DateFormatter()
    timeFormatter.dateFormat = "HHmmss"
    timeFormatter.timeZone = TimeZone(identifier: "UTC")
    let time = timeFormatter.date(from: "131006")
    

    只提供一个时间,但没有日/月/年 . 在这种情况下,日期格式化程序使用默认日期2001年1月1日,您可以验证

    print(time!) // 2000-01-01 13:10:06 +0000
    

    夏令时在当天未激活,因此该时间点的当地时间为 14:10 ,而不是 15:10 .

    要解决此问题,您可以组合从服务器发送的日期和时间字符串并解析该字符串,或者首先转换日期字符串并在转换时间字符串时将其设置为默认日期:

    timeFormatter.defaultDate = ...
    

相关问题