DateFormatter returns 意外的时区日期
DateFormatter returns unexpected date for Timezone
我已经阅读了多篇关于此的帖子,大多数是由于未设置特定时区而系统获取当前时区。我的场景略有不同并给出了意想不到的结果,所以我会尝试详细解释。
我正在处理 returns 日期拆分为日期和时间的后端,存储为整数值。例如,return 值可能是 131006
,这将转换为 13:10:06
。我知道这个后端总是 returns UTC 中的日期。我将其转换为字符串,然后使用以下代码将字符串转换为日期:
let timeFormatter = DateFormatter()
timeFormatter.dateFormat = "HHmmss"
timeFormatter.timeZone = TimeZone(identifier: "UTC")
let time = timeFormatter.date(from: "131006")
为了做一些检查,我在这段代码中写了一些打印语句。这里最重要的是 print(timeFormatter.timeZone.abbreviation())
,即 returns Optional("GMT")
。这很好并且符合预期,因为 GMT == UTC。我还检查了时间的价值,returns 2000-01-01 13:10:06 +0000
,这仍然是预期的结果。
现在转到代码,然后我将该日期格式化为所需的字符串,并使用所需的时区:
let timeToString = DateFormatter()
timeToString.dateFormat = "HH:mm"
timeToString.timeZone = TimeZone.current
let timeString = timeToString.string(from: time!)
在这段代码中,我还打印了 TimeZone.current.abbreviation())
属性,其中 returns Optional("GMT+2")
,这又是预期的结果。但是,当我们打印 timeString
变量的值时,输出的是 14:10
,而不是 15:10
的预期结果。
我使用 DateFormatter 的方式有什么问题?谢谢!
在
let timeFormatter = DateFormatter()
timeFormatter.dateFormat = "HHmmss"
timeFormatter.timeZone = TimeZone(identifier: "UTC")
let time = timeFormatter.date(from: "131006")
只提供了时间,没有提供 day/month/year。在这种情况下,日期格式化程序使用默认日期 2001 年 1 月 1 日,您可以使用
进行验证
print(time!) // 2000-01-01 13:10:06 +0000
那天没有夏令时,因此
您那个时间点的本地时间是 14:10
,而不是 15:10
。
要解决这个问题,您可以结合日期和时间字符串
从服务器发送并解析,或转换日期字符串
首先并在转换时间字符串时将其设置为默认日期:
timeFormatter.defaultDate = ...
我已经阅读了多篇关于此的帖子,大多数是由于未设置特定时区而系统获取当前时区。我的场景略有不同并给出了意想不到的结果,所以我会尝试详细解释。
我正在处理 returns 日期拆分为日期和时间的后端,存储为整数值。例如,return 值可能是 131006
,这将转换为 13:10:06
。我知道这个后端总是 returns UTC 中的日期。我将其转换为字符串,然后使用以下代码将字符串转换为日期:
let timeFormatter = DateFormatter()
timeFormatter.dateFormat = "HHmmss"
timeFormatter.timeZone = TimeZone(identifier: "UTC")
let time = timeFormatter.date(from: "131006")
为了做一些检查,我在这段代码中写了一些打印语句。这里最重要的是 print(timeFormatter.timeZone.abbreviation())
,即 returns Optional("GMT")
。这很好并且符合预期,因为 GMT == UTC。我还检查了时间的价值,returns 2000-01-01 13:10:06 +0000
,这仍然是预期的结果。
现在转到代码,然后我将该日期格式化为所需的字符串,并使用所需的时区:
let timeToString = DateFormatter()
timeToString.dateFormat = "HH:mm"
timeToString.timeZone = TimeZone.current
let timeString = timeToString.string(from: time!)
在这段代码中,我还打印了 TimeZone.current.abbreviation())
属性,其中 returns Optional("GMT+2")
,这又是预期的结果。但是,当我们打印 timeString
变量的值时,输出的是 14:10
,而不是 15:10
的预期结果。
我使用 DateFormatter 的方式有什么问题?谢谢!
在
let timeFormatter = DateFormatter()
timeFormatter.dateFormat = "HHmmss"
timeFormatter.timeZone = TimeZone(identifier: "UTC")
let time = timeFormatter.date(from: "131006")
只提供了时间,没有提供 day/month/year。在这种情况下,日期格式化程序使用默认日期 2001 年 1 月 1 日,您可以使用
进行验证print(time!) // 2000-01-01 13:10:06 +0000
那天没有夏令时,因此
您那个时间点的本地时间是 14:10
,而不是 15:10
。
要解决这个问题,您可以结合日期和时间字符串 从服务器发送并解析,或转换日期字符串 首先并在转换时间字符串时将其设置为默认日期:
timeFormatter.defaultDate = ...