我对这些代码行有一个奇怪的问题:
NSDateFormatter * df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"MMyyyy"];
NSDate * date = [df dateFromString:@"062008"];
NSLog(@"Date %@", date);
结果是:
Date (null)
但是当我这样改变月份时:
NSDateFormatter * df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"MMyyyy"];
NSDate * date = [df dateFromString:@"072008"];
NSLog(@"Date %@", date);
结果是:
Date 2008-06-30 23:00:00 +0000
仅在六月(06)月份,字符串的日期转换失败!
我认为,这与时区,任何想法有关。
由于
解决了:
[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
正如我所想,它与时区有关。
答案 0 :(得分:11)
恭喜,您发现了更多时区怪异!你是正确的,改变你的时区将解决问题。让我们去探索,看看我们是否能找出原因!
首先,我们将尝试找到发生这种奇怪现象的每个时区:
NSArray *tzs = [NSTimeZone knownTimeZoneNames];
NSDateFormatter *f = [[NSDateFormatter alloc] init];
f.dateFormat = @"MMyyyy";
for (NSString *name in tzs) {
f.timeZone = [NSTimeZone timeZoneWithName:name];
NSDate *date = [f dateFromString:@"062008"];
if (date == nil) {
NSLog(@"%@", name);
}
}
这将遍历所有已知的时区,并尝试在该时区解析“062008”。如果我们运行它,我们发现它记录:
Africa/Casablanca
Asia/Karachi
所以我猜你住在卡萨布兰卡或卡拉奇(因为默认情况下,你的NSDateFormatter
是用你的时区初始化的,这就是你看到这个问题的原因;可能是卡萨布兰卡,因为你看起来比格林尼治标准时间提前1小时。)
让我们看看我们是否能够弄清楚这些时区的奇怪之处:</ p>
$ zdump -v Africa/Casablanca
... snip ...
Africa/Casablanca Sun Jun 1 00:00:00 2008 UTC = Sun Jun 1 01:00:00 2008 WEST isdst=1
... snip ...
$ zdump -v Asia/Karachi
... snip ...
Asia/Karachi Sat May 31 19:00:00 2008 UTC = Sun Jun 1 01:00:00 2008 PKST isdst=1
... snip ...
果然,看起来卡萨布兰卡和卡拉奇都在2008年6月1日的午夜时分跳过了。因此,你实际上是在给它一个不完整的日期,它正在返回nil
。简而言之。
在这种情况下,正确的答案 来改变你的时区(GMT可能是一个很好的选择),因为你解析的这个字符串很可能不是来自用户输入(鉴于它很奇怪)格式),因此应根据标准时区进行解析。虽然我确信卡萨布兰卡和卡拉奇真的很整洁,但他们的时区并不常见......
夏令时应该废除。
答案 1 :(得分:1)
是的!你是绝对正确的。我也面临同样的问题我的想法也与时区有关。不确定这是否是你问题的理想解决方案
NSString *strDate=@"06-2008";
NSDateFormatter * df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"MM-yyyy"];
[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
NSDate * date = [df dateFromString:strDate];
NSLog(@"Date %@", date);
答案 2 :(得分:1)
[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];