gpt4 book ai didi

ios - NSDateFormatter 意外调整时间的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:59:54 25 4
gpt4 key购买 nike

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

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

我目前在 BST 工作。

我有以下代码:

    +(NSDate *)getDate:(NSString *)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 进行调整?

最佳答案

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

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

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

除非像您一样默认格式化程序使用“UTC”区域设置,否则不应将其与“+0”时区混淆。这就是为什么你得到不同的日期。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com