来自NSDate的意外值

我试图在一个date存储一个时间。 在这种情况下1.5秒。 我把时间存储在这样的date:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"mm:ss.SS"]; [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]]; NSDate *date1 = [dateFormatter dateFromString:@"00:01.50"]; 

但是,如果我看在debugging区域,我可以看到date1的值设置为:

 date1 = (NSDate *) 0x1dd32b30 2000-01-01 01:00:01 CET 

谁能告诉我为什么会发生这种情况?

因为在SO上有大量与NSDate相关的问题,并且它们都具有相同的色调,所以我会给你一个更长的答案,可能这个问题可以从其他问题中提出。

答:有一个常见的误解,一个date是什么:date是时间轴上的一个点。 它不处理数小时或数分钟, 处理日,月,年, 处理时区。

这是时间轴上的一个点。 期。

(在内部它是由一个浮点数表示的,这是一个惊喜吗?)

B.还有一个常见的误解,那就是:如果具有相同的价值,那么两个date,即时间轴上的点是相等的。 这并不意味着它们具有相同的表示。 两次可以是平等的,即使他们的代表是完全不同的。 (这是发生在你身上的事情。)为了比较,无论哪个时区正在使用,预期的是$ whatever都没有关系。 比较是没有关系的,哪个日历正在使用,预计还是$ whatever。 如果是德国科隆11:11(UTC + 1),英国伦敦(UTC + 0)10:11。 这是同一时间。

如果date在另一个date之前的时间线上,则date更早。

那么,这些有趣的事情,如日,月,时区等? 由于在星际迷航之外26,182,382,303.127373时间难以理解和处理,人类开始给时间线上有趣的名字点。 这个表示不是date。 他们是date的表示。 这与数字是一样的问题。 你不开这个玩笑吗?

“有十种人:那些懂二进制数字的人,那些不懂的人。”

这个笑话的精神在于,如果它是用十进制表示,或者可以是用二进制表示法写成的两个值,则10可以是十的值。 没有人可以说,除非他知道用于表示的数字系统,否则“10”表示什么值。 大多数人认为它是十进制的,所以“10”就是十。 这是一个stream行的惯例。 而且这个工作很好,因为几乎全世界都采用了这个惯例。 但是:“10”可以表示两个不同的值。 反之亦然:相同的值可以写成不同的“string”:十进制表示法中的10 等于二进制表示法中的1010(等于“2 + 8”,sqrt(100),…这就是,为什么允许在它们之间写=)。

不幸的是(时间不是必须在当地简单地工作)时间没有世界范围的约定。 如果有人写“11:11”,你不能说什么时间(记住,这是时间轴上的一个点)。 这个人可能隐含地说,这是他时区的日历系统中的时间。 但是你必须知道他在世界的哪个位置。 考虑到日,月等,你可能不得不知道他的宗教信仰是什么,因为即使在一个国家,不同宗教的人也使用不同的日历。

由于一方面世界范围内没有常规的约定,而Mac OS则是在世界各地的计算机系统上运行,所以不能假定打印出的时间是用期望的符号表示的。

所以它是完整的,呃,不是很聪明比较date的string。 你不比较date,你比较string。

在比较时间(包括date)之前,您必须将表示转换为“真实”时间。 您必须添加关于日历的信息,表示被写入和时区(包含在Cocoa中的日历中)。

在cocoa你使用NSDateFormatter,NSCalendar,NSDateComponents的实例做这个工作。 如果让NSDateFormatter将表示转换为时间,反之亦然,则必须设置日历。 (NSDateFormatter假定,select本地日历,如果你不设置的话)。如果NSDateFormatter不知道要使用哪个日历,NSDateFormatter根本不可能做任何的转换工作。 而这对你来说根本不可能。

然后,你可以做一些计算,它的date,时间,NSDate的实例,包括比较,至less你必须使用日历将其转换回人类可读的表示。

你得到什么,让你觉得这是一个错误的时间,只是一个正确的时间,但却代表你没有想到的。 (-description总是提供UTC + 0)。

在date上试用NSLog将仅以GMT格式返回date。 所以如果你想检查你是否得到正确的时间或date,将date转换为string和NSLog。

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"mm:ss.SS"]; [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]]; NSDate *date1 = [dateFormatter dateFromString:@"00:01.50"]; NSString *dateString = [dateFormatter stringFromDate:date1]; NSlog(@"%@",dateString);