【问题标题】:creating a wrong NSDate创建错误的 NSDate
【发布时间】:2015-06-12 16:45:27
【问题描述】:

这是代码

  NSDateComponents *comps = [[NSDateComponents alloc] init];
  [comps setDay:13];
  [comps setMonth:6];
  [comps setYear:2015];

  NSCalendar *gregorian = [[NSCalendar alloc]
                           initWithCalendarIdentifier:NSGregorianCalendar];
  NSDate *date = [gregorian dateFromComponents:comps];

NSLog(@"date = %@", date);

结果是2015-06-12 23:00:00 +0000

12?今天是 13 号!!!

为什么会这样?漏洞?

【问题讨论】:

    标签: ios objective-c iphone cocoa nsdate


    【解决方案1】:

    问题在于 NSLog() 的方式和 NSDate description 方法显示的日期是 GMT (UTC)。注意时间偏移:“+0000”,这可能不是您的时区。

    所有日期都以 GMT 格式在内部存储。要获取当前时区或其他时区的字符串,请使用NSDateFormatter

    【讨论】:

    • 这是 Apple 一直以直观的方式做的事情。谢谢!
    • 您可以根据需要将NSCalendar 实例的时区设置为UTC。
    • 是的,关键是:NSLog是用来调试的。哪些不同的对象记录是未记录的,因此取决于版本。这不是你向用户展示的东西。所以NSDate 可以以它喜欢的任何方式登录,并且完全明确地决定通过+0000 登录GMT。您甚至不需要“所有日期都存储在 GMT 内部”的事实;它们的存储方式基本上与您无关。
    • 当然,您不需要知道 Apple 如何存储日期,但 Apple 实际上声明日期存储为:“NSDate 使用的绝对参考日期(2001 年 1 月 1 日的第一个实例,格林威治标准时间) ”。但它确实有助于了解日期不存储在用户的本地时区中。
    • NSLog() 主要用于日志记录,not 用于调试。 (这就是为什么它被称为NSLog())。在日志中,定义全球范围内的时间通常很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2010-12-23
    • 1970-01-01
    相关资源
    最近更新 更多