【问题标题】:NSDate and string without timezone information没有时区信息的 NSDate 和字符串
【发布时间】:2016-03-21 17:16:57
【问题描述】:

我正在解析一些由 Web 服务返回的 XML。字符串:2015-12-24T12:00:00fromTimestamp 中找到,没有时区。 “天才”(我不是那个意思)在几分钟内将时区信息保存在 XML 中自己的字段中。所以300 表示 GMT+05:00。

我已经阅读了很多关于NSDate 和所有这些时区的资料,我知道NSDate 不关心时区,这就是NSDateFormatter 的工作。

但是,为了“转换”没有时区的时间戳,以便 NSDate 中的值表示 GMT 时间,我将GMT+05:00 添加到字符串中,使其变为2015-12-24T12:00:00 +05:00。这是必须做的对吗?当您从字符串转换为日期时,如果不添加时区,NSDate 会认为该值是 GMT 时间?那是我不明白的部分。只转换没有该时区信息的字符串是错误的,因为NSDate 不能从NSDate 中的值中减去5 小时?那是对的吗?我很难解释。

【问题讨论】:

    标签: ios swift timezone nsdate


    【解决方案1】:

    我发现将 Martin 的方法包装为 String 类的扩展更方便。它还会在其前面加上当前时间戳并将文本写入调试器输出。

    斯威夫特 5:

    "Hello world".log()
    

    2019-09-05 12:18:10 你好世界

    extension String {
    
        func log() {
    
            let fmt = DateFormatter()
            fmt.dateFormat = "yyyy-MM-dd' 'HH:mm:ss"
            let formattedString = "\(fmt.string(from: Date())) \(self)"
    
            print(formattedString)
    
            let log = URL(fileURLWithPath: "log.txt")
            do {
                let handle = try FileHandle(forWritingTo: log)
                handle.seekToEndOfFile()
                handle.write((formattedString+"\n").data(using: .utf8)!)
                handle.closeFile()
            } catch {
                print(error.localizedDescription)
                do {
                    try self.data(using: .utf8)?.write(to: log)
                } catch {
                    print(error.localizedDescription)
                }
            }        
        }    
    }
    

    【讨论】:

      【解决方案2】:

      您的评估是正确的,您的解决方案是两种可能的解决方案之一。

      为确保日期字符串正确转换为 NSDate,您可以执行以下两种操作之一:

      1. 您需要确保日期字符串包含时区信息,并且日期格式化程序的格式字符串包含正确的时区格式说明符。这就是您在问题中描述的内容。
      2. 您保留日期字符串,没有时区信息。但是您根据从 XML 获得的时区字段在日期格式化程序上设置特定时区。

      任何一种方法都会为您提供正确的NSDate

      更新:我的第二种方法显示在 Martin R 的回答中。

      【讨论】:

      • 所以我关于在转换为 NSDate 之前将时区信息添加到字符串的必要性的推理是否正确?因为否则时间戳会被解释为格林威治标准时间而不先从中减去几个小时? (很难解释我的意思,希望你能理解)。
      • 关闭。如果没有从日期字符串中解析出特定的时区信息并且日期格式化程序没有设置特定的时区,则日期字符串将被视为“本地”时间,而不是 GMT。
      • 这是否意味着它使用从系统获取的时区?
      • 表示使用用户当前的时区。
      • 因此,如果用户当前时区为 +05:00,这是否意味着如果您使用时区设置为 +01:00 的格式化程序格式化该日期,它会从NSDate 对象?
      【解决方案3】:

      设置日期格式化程序的时区可能更简单 明确地。示例(为简洁起见省略了错误检查):

      let fromTimestamp = "2015-12-24T12:00:00"
      let timeZoneInfo = "300"
      
      let fmt = NSDateFormatter()
      fmt.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
      
      let secondsFromGMT = Int(timeZoneInfo)! * 60
      fmt.timeZone = NSTimeZone(forSecondsFromGMT: secondsFromGMT)
      
      let date = fmt.dateFromString(fromTimestamp)
      

      【讨论】:

        猜你喜欢
        • 2013-03-18
        • 2015-04-27
        • 2012-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-05
        • 2014-12-25
        相关资源
        最近更新 更多