日期格式化程序返回6月的nil

ysn*_*mhl 9 cocoa nsdate nsdateformatter

我对这些代码行有一个奇怪的问题:

NSDateFormatter * df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"MMyyyy"];
NSDate * date = [df dateFromString:@"062008"];
NSLog(@"Date %@", date);
Run Code Online (Sandbox Code Playgroud)

结果是:

 Date (null)
Run Code Online (Sandbox Code Playgroud)

但是当我像这样改变月份时:

NSDateFormatter * df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"MMyyyy"];
NSDate * date = [df dateFromString:@"072008"];
NSLog(@"Date %@", date);
Run Code Online (Sandbox Code Playgroud)

结果是:

Date 2008-06-30 23:00:00 +0000
Run Code Online (Sandbox Code Playgroud)

仅在6月(06)的月份,字符串的日期转换失败!

我认为,这与时区,任何想法有关.

谢谢

解决了 :

[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
Run Code Online (Sandbox Code Playgroud)

我想,这与时区有关.

Dav*_*ong 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这将遍历所有已知的时区,并尝试在该时区解析"062008".如果我们运行它,我们发现它记录:

Africa/Casablanca
Asia/Karachi
Run Code Online (Sandbox Code Playgroud)

所以我猜你住在卡萨布兰卡或卡拉奇(因为默认情况下,你时区NSDateFormatter是初始化,这就是为什么你会看到这个问题;可能卡萨布兰卡,因为你看起来比格林威治标准时间提前1小时) .

让我们看看我们是否能够弄清楚这些时区的奇怪之处:

$ 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 ...
Run Code Online (Sandbox Code Playgroud)

果然,看起来卡萨布兰卡和卡拉奇都在2008年6月1日的午夜时分跳过了.因此,你实际上是在给它一个不完整的日期,而且它正在回归nil.简而言之.

在这种情况下,正确的答案更改您的时区(GMT可能是一个很好的选择),因为您正在解析的这个字符串很可能不是来自用户输入(鉴于其奇怪的格式),因此应该根据一个标准的时区.虽然我确信卡萨布兰卡和卡拉奇真的很整洁,但他们的时区并不常见......

TL; DR:

夏令时应该废除.


ysn*_*mhl 1

已解决:正如我所想,这与时区有关。

[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
Run Code Online (Sandbox Code Playgroud)