在 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-推荐答案 strong>
NSDate 对象和它使用格式化程序的表示之间有一个重要的区别:
NSDate 对象将始终与通用时间标准 (UTC) 相关。它忽略了夏令时和时区,这是您希望它存储在数据库中的方式(作为 UTC 时间戳)。
当您使用格式化程序时,它通常用于向用户显示日期。因此,格式化程序将默认使用您当前设备的区域设置来表示日期,因此如果您的日期是 11:00 并且您处于没有夏令时的 +4 时区,您将获得的日期将是 15:00。如果有夏令时,时间会略有变化。您需要这种行为,因为这意味着无论您身在何处,用户都将始终获得他们正在查看的日期的正确相对时间。
除非像您一样,您默认格式化程序使用“UTC”语言环境,不应与“+0”时区混淆。这就是为什么你得到不同的日期。
关于ios - NSDateFormatter 意外调整时间的问题,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/37683301/
|