Objective c 如何知道从NSDate转换时为NSDate格式化程序设置的时区

Objective c 如何知道从NSDate转换时为NSDate格式化程序设置的时区,objective-c,ios,cocoa,Objective C,Ios,Cocoa,我有一个函数,可以使用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 resetSyst

我有一个函数,可以使用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?当从字符串转换为NSDate时,通过查看Z的缺失/存在来确定其日期。但是如果我有NSDate,如何知道将格式化程序设置为哪个时区

您的NSDate存储为UTC/GMT时区。因此,当您将其转换为字符串时,您可以选择希望字符串显示的时区。没有“正确”的答案。你想显示什么就显示什么。

你的第一句话不正确
NSDate
s没有时区——它们只是表示一个时刻。不过,其他一切都很恰当。嗯,我想我的第一句话很好。这是一个没有时区偏移的时刻,与UTC(无偏移)相同。不,没有偏移,因为没有分区。如果我有一个
NSDate
表示2012年球在时代广场落下的那一刻,那么同样的
NSDate
也表示伦敦早上5点。看一个有时区的日期就是一种解释。是的,你在时代广场投球的时间是伦敦早上5点,UTC凌晨4点。你瞧,如果你在没有时区的情况下显示那一刻的NSDate,它会显示为凌晨4点。在没有参考点的情况下,您无法在时间上偏移某个时刻(您将向何处添加偏移?)。我向您保证,除非您提供偏移量,否则您永远无法获得与UTC时区不同的NSDate打印结果。没有时区与UTC是一回事。苹果的文档中写道:“NSDate唯一的原始方法TimeIntervalsIncerenceDate为NSDate界面中的所有其他方法提供了基础。该方法返回相对于绝对参考日期(2001年1月1日格林尼治标准时间)的时间值。”有时可能会有点混乱,因为如果您转储NSDate,它确实会显示时区。很明显,原始时区隐藏在对象内部的某个地方,但它只能通过
描述
访问,并且不参与任何日期转换。