【发布时间】:2015-03-03 22:50:50
【问题描述】:
TL/DR:我需要一个 NSDate 专门代表 1970-01-01 00:00:00 +0000。使用 [NSDate dateWithTimeIntervalSince1970:0] 返回为我的时区调整的日期。我不知道如何解决这个问题。
我正在尝试编写一个围绕NSDates 的Objective-C iOS 测试。问题是,我尝试创建的任何NSDate 对象,无论是直接的,还是使用NSDateFormatter 或[NSDateComponents dateFromComponents],似乎总是会针对我的Mac 当前时区进行调整。也就是说,测试将使用 NSDate 的时区调整值,它也会以这种方式出现在 Xcode 调试器中。但是,如果我在 NSDateComponents 或 NSDateFormatter 中将时区明确设置为 GMT,当我使用 po 检查控制台中的值时,它将像我设置的那样返回 GMT 的日期/时间。
例如,[NSDate dateWithTimeIntervalSince1970:0] 返回一个日期为 1969-12-31 19:00:00 -0500 的 NSDate。 [NSDate date] 返回当前日期和时间,但根据我的时区:2015-03-03 05:49:32 -0500。我一生都想不通为什么我不能简单地将1970-01-01 00:00:00 +0000 作为 NSDate。
我有什么遗漏吗?谁能帮我解决这个问题?
谢谢!
编辑:这是我尝试使用NSDateComponents:
NSCalendar *calendar = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setYear:1970];
[components setMonth:1];
[components setDay:1];
[components setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSDate *componentDate = [calendar dateFromComponents:components];
componentDate 在控制台中正确显示(当我键入 po componentDate 时),但在调试窗口中显示为时区调整。此外,这个时区调整值是我的测试中使用的值,因此它对我编写可靠测试的能力有一定的影响。
【问题讨论】:
-
那是因为你的调试器选择在本地时区表示日期。
po向您展示 NSDate 中的真正内容。 -
@HotLicks 如果它不影响我的测试结果,我会接受这个解释。但是 NSDate 对象本身是时区调整的;这不仅仅是它的呈现方式。
-
NSDate 对象不应进行时区调整。它包含的实际时间是您在 NSLog 或在其上执行
po时所看到的。 -
我见过(虽然不是几年)NSDate 中的时区设置为 UTC 以外的情况。 (显然那里有一个古老的时区字段。)但它不应该影响 NSDate 如何使用 NSDateFormatter 打印。 (你有旧的开发环境吗?iOS 还是 OSX?)
-
"使用
[NSDate dateWithTimeIntervalSince1970:0]会返回为我的时区调整的日期。"不,它没有。它根本不调整NSDate。NSDate没有时区;它反映了一个时间点。如何显示该瞬间是NSDateFormatter的函数(确实了解时区的概念)。因此,将格式化程序的timeZone设置为[NSTimeZone timeZoneForSecondsFromGMT:0],它将以 UTC 格式显示。不用担心调试器显示的内容。
标签: objective-c nsdate nsdateformatter