【问题标题】:How to extract TimeZone from Date object?如何从 Date 对象中提取 TimeZone?
【发布时间】:2017-02-08 21:02:59
【问题描述】:

我有一个这样的 ISO-8601 日期字符串:"2017-02-07T00:00:00-08:00"

如何从该日期提取 TimeZone 对象?

【问题讨论】:

  • Date 对象中没有时区。请说明你真正想要什么。
  • 我已经更新了问题,谢谢。
  • 您没有时区。您与 UTC 有一个偏移量。请参阅the timezone tag wiki 中的“时区!= 偏移量”。

标签: swift datetime swift3 timezone


【解决方案1】:

不幸的是,DateFormatter 无济于事,因为您不想要 Date,它也不提供有关已解析日期字符串的任何时区信息的任何信息。而TimeZone 没有任何可以解析时区偏移字符串的初始化程序。

所以你必须自己做这项工作。由于您有一个固定格式的日期字符串,因此您知道时区偏移量始终是字符串的最后 6 个字符。其中最后 2 个是分钟数,前 3 个是小时数(包括符号)。

从日期字符串中提取这两个子字符串(小时和分钟)。将它们都转换为Int。然后做一些简单的数学计算以秒为单位的偏移量(小时 * 3600 + 分钟 * 60)。

一旦获得了以秒为单位的偏移量,您就可以使用 init(secondsFromGMT:) 初始化程序创建一个 TimeZone 实例。

【讨论】:

    【解决方案2】:

    使用rmaddys 提出的解决方案,我为TimeZone 编写了一个扩展,它应该可以完成这项工作。

    extension TimeZone {
        init?(iso8601String: String) {
            let timeZoneString = String(iso8601String.suffix(6))
            let sign = String(timeZoneString.prefix(1))
    
            guard sign == "+" || sign == "-" else {
                return nil
            }
    
            let fullTimeString = timeZoneString.filter("0123456789".contains)
    
            guard fullTimeString.count == 4 else {
                return nil
            }
            guard let hours = Int(sign+fullTimeString.prefix(2)), let minutes = Int(sign+fullTimeString.suffix(2)) else {
                return nil
            }
    
            let secondsFromGMT = hours * 3600 + minutes * 60
    
            self.init(secondsFromGMT: secondsFromGMT)
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以创建一个仅返回时区的日期格式化程序,如下所示。将缩写更改为您要查找的任何时区。

      let timeZoneOnlyDateFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.timeZone = TimeZone(abbreviation: "UTC")
        formatter.dateStyle = .none
        formatter.timeStyle = .none
        return formatter
      }()
      

      并使用这些函数将其转换为字符串或将字符串转换为日期。

      func formatDateIntoString(date: Date, dateFormatter: DateFormatter) -> String {
        return dateFormatter.string(from: date)
      }
      
      
      func formatStringIntoDate(string: String, dateFormatter: DateFormatter) -> Date! {
        return dateFormatter.date(from: string)
      }
      

      【讨论】:

        猜你喜欢
        • 2010-09-10
        • 1970-01-01
        • 1970-01-01
        • 2022-07-16
        • 2017-06-04
        • 2014-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多