【问题标题】:How to know what timezone to set for an NSDateFormatter when converting from an NSDate从 NSDate 转换时如何知道为 NSDateFormatter 设置的时区
【发布时间】:2012-05-17 11:54:47
【问题描述】:

我有一个使用 NSDateFormatter 将 RFC3339 中的 NSString 转换为 NSDate 的函数,但我不知道如何考虑时区的反向操作。

字符串到NSDate转换的相关部分是:

    // The result of a call to systemTimeZone is cached by the app automatically, if the user changes it that change isn't 
    // reflected unless resetSystemTimeZone is called to clear the cache.
    [NSTimeZone resetSystemTimeZone]; 
    NSLocale *enUSPOSIXLocale;
    enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
    [sRFC3339DateFormatter setLocale:enUSPOSIXLocale];
    if ([fromString hasSuffix:@"Z"] || [fromString hasSuffix:@"z"])
    {
        [sRFC3339DateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
    }
    else 
    {
        [sRFC3339DateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
    }

[sRFC3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];

我的问题是,当从 NSDate 转换为 NSString 的另一个方向时,我怎么知道用什么来调用 setTimeZone?当通过查看 Z 的缺失/存在从字符串到 NSDate 时。但是如果我有一个 NSDate,我怎么知道将格式化程序设置为哪个时区?

【问题讨论】:

  • 它有时会让人有点困惑,因为如果你 NSDump 一个 NSDate 它确实会显示一个时区。显然,原始时区被隐藏在对象内部的某个地方,但它只能通过description 访问,并且它不参与任何日期转换。

标签: objective-c ios cocoa


【解决方案1】:

您的 NSDate 存储为 UTC/GMT 时区。因此,当您将其转换为字符串时,您可以选择要在其中显示字符串的时区。没有“正确”的答案。这是您想要显示的任何内容。

【讨论】:

  • 你的第一句话是错误的。 NSDates 没有时区——它们只是代表一个时刻。不过,其他一切都在现场。
  • 嗯,我觉得我的第一句话很好。这是一个没有时区偏移的时刻,与 UTC(无偏移)相同。 en.wikipedia.org/wiki/Time_zone#Unix
  • 不,没有偏移,因为没有区域。如果我有一个 NSDate 代表 2012 年时代广场球落下的那一刻,那么 same NSDate 也代表伦敦早上 5 点。查看带有时区的日期是一种解释。
  • 是的,你在时代广场丢球的那一刻是伦敦早上 5 点和世界标准时间凌晨 4 点。你瞧,如果你在没有应用时区的情况下显示你的 NSDate,它会显示凌晨 4 点。如果没有参考点,您将无法及时偏移(您会将偏移添加到什么?)。我向您保证,除非您提供偏移量,否则您永远无法让 NSDate 以不同于 UTC 时区的方式打印。没有时区与说 UTC 是一回事。
  • 来自 Apple 的文档:“NSDate 的唯一原始方法 timeIntervalSinceReferenceDate 为 NSDate 接口中的所有其他方法提供了基础。此方法返回相对于绝对参考日期的时间值——第一个格林威治标准时间 2001 年 1 月 1 日。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
相关资源
最近更新 更多