OStack程序员社区-中国程序员成长平台

标题: ios - NSDateFormatter 意外调整时间的问题 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-11 16:40
标题: ios - NSDateFormatter 意外调整时间的问题

在 Objective-C 中工作时,我有一种方法可以正确格式化从数据库中获取的日期。 数据库返回没有时区信息的日期和时间。例如“2016-06-07T09:29:50.253”。

问题在于它正确地获取了日期,然后将其调回了一个小时。对于我 09:29 的时间,我会以 08:29 结束。

我目前正在与 BST 合作。

我有以下代码:

    +(NSDate *)getDateNSString *)date {

//Gets the date
        date = [date stringByReplacingOccurrencesOfString"T" withString" "];
        date = [date componentsSeparatedByString: @"."][0];

//Formats the date
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
//This line is the one that fixes it.
        [formatter setTimeZone: [NSTimeZone timeZoneWithName"UTC"]];
        [formatter setDateFormat"yyyy-MM-dd HH:mm:ss"];

        NSDate  *returnDate = [formatter dateFromString:date];
        return returnDate;
    }

我做了一些谷歌搜索,发现添加以下行可以解决问题。

[formatter setTimeZone: [NSTimeZone timeZoneWithName"UTC"]];

这暂时没问题,但我担心它会在夏令时再次中断,我不完全确定为什么会修复它。我还希望我能够让它适应不同的时区,但到目前为止还没有运气。

更多信息:

-日期来自 sql server 中的 getDate() 调用。我对此的理解是它按原样获取日期,不了解时区。如果我进行选择调用,我会得到结果:'2016-06-07T09:29:50.253'

要形式化问题: 为什么上面的代码会调整returnDate?



Best Answer-推荐答案


NSDate 对象和它使用格式化程序的表示之间有一个重要的区别:

NSDate 对象将始终与通用时间标准 (UTC) 相关。它忽略了夏令时和时区,这是您希望它存储在数据库中的方式(作为 UTC 时间戳)。

当您使用格式化程序时,它通常用于向用户显示日期。因此,格式化程序将默认使用您当前设备的区域设置来表示日期,因此如果您的日期是 11:00 并且您处于没有夏令时的 +4 时区,您将获得的日期将是 15:00。如果有夏令时,时间会略有变化。您需要这种行为,因为这意味着无论您身在何处,用户都将始终获得他们正在查看的日期的正确相对时间。

除非像您一样,您默认格式化程序使用“UTC”语言环境,不应与“+0”时区混淆。这就是为什么你得到不同的日期。

关于ios - NSDateFormatter 意外调整时间的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37683301/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4