【问题标题】:iOS | Swift | Date formatting | What is going wrong?iOS |斯威夫特 |日期格式 |出了什么问题?
【发布时间】: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


【解决方案1】:

iOS 中没有“某种时间格式的日期”。日期是一个时间点。它根本没有时区。

文本可以以与时区相关的方式描述日期。这就是您输入的内容:您有一个字符串,并且您被告知它是 GMT 中的字符串。因此,您使用具有 GMT 正确设置的 DateFormatter 将字符串转换为日期。你永远不会改变那个日期。您可以使用另一个具有正确设置的 DateFormatter,以便用户将 Date 转换为用户时区中的字符串。

顺便说一句。绝对不需要通过调用 timeIntervalSince1970 来为 Date 添加秒数。有一种方法可以将秒数直接添加到日期。还有一些方法可以将分钟、小时、天、周、月、年添加到日期;这些需要一个 Calendar 对象,因为添加“一个月”的含义取决于日历。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2017-03-24
    • 2015-08-02
    相关资源
    最近更新 更多