【发布时间】:2021-03-02 19:09:08
【问题描述】:
我们正在从服务器获取 GMT 日期。在解析时,我们使用 dateDecodingStrategy 作为 iso8601。我们还从服务器获取特定的时区字符串。我们需要考虑该时区并将 GMT 日期转换为特定于该时区。
private func dateInUserTImeZone(date: Date) -> Date {
//userSessionTImeZone is the TimeZone received from server.
let timezoneOffset = userSessionTImeZone.secondsFromGMT(for: date)
let epochDate = date.timeIntervalSince1970
let timezoneEpochOffset = epochDate + Double(timezoneOffset)
let updatedDate = Date(timeIntervalSince1970: timezoneEpochOffset)
return updatedDate
}
转换为从服务器接收到的时区 (CST) 后的日期 --> 2021-02-12 03:18:54 +0000 使用上述函数,其中我们传递了通过解析 JSON 响应创建的 iso8601 日期强>
//以下代码用于将格式应用于上述日期。
let dateFormatter: DateFormatter(dateFormat: "MMMdd", useTemplate: true)
dateFormatter.setLocalizedDateFormatFromTemplate(dateFormatTemplate)
dateFormatter.doesRelativeDateFormatting = isRelative
let strDate = dateFormatter.string(from: date) //** date is 2021-02-12 03:18:54 +0000**
我们在 strDate 中的值是 2 月 11 日而不是 2 月 12 日
这里出了什么问题以及如何解决?将日期转换为特定时区也是进行其他计算的要求。
【问题讨论】:
-
您真的需要通过加/减秒来移动时间戳,还是只需要在不同时区解释一个时间戳?我怀疑后者,在这种情况下,您应该简单地使用带有特定时区的
DateFormatter。 -
@Gereon,格式化的日期字符串生成结束了。在此之前,我需要将从服务器收到的日期与当前日期进行比较。所以我首先在那个时区转换了这两个日期并进行比较。对于比较结果之一,我正在使用日期格式化程序来获取“MMM dd”格式的日期字符串。
-
不,您不是在“转换”这些日期,而是将它们更改为其他日期。就像@gnasher729 在他们的回答中所说,
Date没有时区的概念,它只是一个固定的时间点。您需要做的就是解析服务器响应(包括它的时区信息)并将其与Date()进行比较。
标签: ios swift5 iso8601 dateformatter