NSDate显示错误的一天

时间:2013-12-01 02:24:44

标签: ios nsstring nsdate nsdateformatter

我正在接受一个NSDate,只提取一个2位数的数字,代表该月的某一天进入NSString。其中一个日期是:

2013-11-30 00:00:00 +0000

我用:

NSDateFormatter *formatter2 = [[NSDateFormatter alloc] init];
[formatter2 setDateFormat:@"dd"];
NSString *datefromdate = [formatter2 stringFromDate:articleDate];
NSLog(@"Date%@", datefromdate);
[formatter2 release];

但是日志又回来了

29

2 个答案:

答案 0 :(得分:8)

您可能处于负时区,即GMT减去某事。这就是为什么2013-11-30 00:00:00 +0000 GMT在您登录时的第29天。将格式化程序设置为GMT,你会没事的。

答案 1 :(得分:2)

设置您希望时间日期格式化程序使用的时区。 NSDate是2001年1月1日GMT的第一个瞬间,因此没有时区信息。

因此,根据Apple的说法,这将变得复杂,最多需要五个班级:NSDateFormatterNSDateNSCalendarNSTimeZone,最后{{1 }}

如果你想要的只是你可以使用NSDateComponents的那一天。

示例:

NSDateComponents

NSLog输出:

NSString *dateString = @"2013-11-30 00:00:00 +0000";

NSDateFormatter *inDateFormatter = [[NSDateFormatter alloc] init];
[inDateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
NSDate *date = [inDateFormatter dateFromString:dateString];
NSLog(@"dateFromString: %@", date);

NSTimeZone *timezone = [NSTimeZone timeZoneForSecondsFromGMT:0];

// Using date formatter, result is a string
NSDateFormatter *outDateFormatter = [NSDateFormatter new];
[outDateFormatter setTimeZone:timezone];
[outDateFormatter setDateFormat:@"dd"];
NSString *dayString = [outDateFormatter stringFromDate:date];
NSLog(@"date formatter day: %@", dayString);

// Using date components, result is an integer
NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setTimeZone: timezone];
NSDateComponents *dateComponents = [calendar components:NSDayCalendarUnit fromDate:date];
NSInteger day = [dateComponents day];
NSLog(@"date components day: %i", day);