• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-11 16:40:24 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

在 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap