dateFromComponents的意外结果:

时间:2012-03-17 15:33:34

标签: objective-c io nsdate nsdatecomponents

以下代码

NSCalendar *cal = [NSCalendar currentCalendar];
[cal setFirstWeekday:2];
[cal setMinimumDaysInFirstWeek:4];

NSDateComponents *comp = [[NSDateComponents alloc] init];
[comp setYear: 2012];
[comp setMonth:3];
[comp setDay: 12];
NSDate *date = [cal dateFromComponents:comp];
NSLog(@"date:%@",date);

日志:

date:2012-03-11 23:00:00 +0000

任何想法,为什么会发生这种情况以及如何避免 TNX

3 个答案:

答案 0 :(得分:2)

我假设您在本地使用CET时区。这就是[NSCalendar currentCalendar]将用作时区的原因。

使用NSLog转储NSDate时,您将以原始UTC格式获取日期。要使用本地格式打印日期,请查看NSDateFormatter类,该类具有timeZone属性:

....
NSDate *date = [cal dateFromComponents:comp];
NSDateFormatter* fmt = [[NSDateFormatter alloc] init];
fmt.timeZone = [NSTimeZone defaultTimeZone]; // Probably not required
NSLog(@"date:%@", [fmt stringFromDate:date]);

答案 1 :(得分:2)

设定时区

NSCalendar *cal = [NSCalendar currentCalendar];

[cal setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];

答案 2 :(得分:2)

当您致电dateFromComponents:时,您将丢失所有时区和日历信息,并留下一个NSDate对象,其中包含您的日期组件所代表的时刻,但没有其他内容。在NSDate对象上使用NSLog时,该时刻将转换为UTC时间并呈现为人类可读的字符串。

您需要提供有关您要实现的目标的更多信息,以便能够回答您关于如何避免此问题的第二个问题。