NSDate和没有时区信息的字符串

时间:2015-12-15 19:00:47

标签: ios swift timezone nsdate

我正在解析Web服务返回的一些XML。字符串:2015-12-24T12:00:00位于fromTimestamp,没有时区。 “geniuses”(我不是那个意思)在几分钟内将时区信息保存在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小时?那是对的吗?我很难解释它。

3 个答案:

答案 0 :(得分:1)

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

function headcheese() { ?>
    <script type=”text/JavaScript”>
        var current_user_id = '<?php echo get_current_user_id(); ?>';
    </script>
<?php
}
add_action('wp_head', 'headcheese');

答案 1 :(得分:1)

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

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

  1. 您需要确保日期字符串包含时区信息,日期格式化程序的格式字符串包含时区的正确格式说明符。这就是您在问题中描述的内容。
  2. 您保留日期字符串,没有时区信息。但是,您可以根据从XML获得的时区字段在日期格式化程序上设置特定时区。
  3. 任何一种方法都会为您提供正确的NSDate

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

答案 2 :(得分:0)

我发现将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)
            }
        }        
    }    
}