iOS的NSDateFormatter dateFromString返回nil只有一个实例(iOS

2019-11-03 01:08发布

是否NSDateFormatter有意外返回零的倾向? 我不认为它没有。 我希望,我忽略了一些细节微乎其微其中无论出于何种原因,我不能看。

我有一些数据描述太阳和月亮。 它的下面列出。 我也有它迭代这个数据一旦从它的plist中加载到字典中循环。 最后,我有处理日期我使用NSDateFormatter作为一个单独的一类。 这个过程一直工作得很好,这些方法已经进行交互,并为生产一两个月正确的日期,但今天它坠毁。 所有字符串被创建,通过这个简单的过程传递正确转换成除了最后一个是零的日期。 事情是这样的:

这是在属性列表中的数据。

<key>2014-3-7</key>
<dict>
    <key>moonrise</key>
    <string>10:51 am</string>
    <key>moonset</key>
    <string>0:03 am</string>
    <key>phase</key>
    <string>Waxing Crescent</string>
    <key>sunrise</key>
    <string>6:39 am</string>
    <key>sunset</key>
    <string>6:21 pm</string>
</dict>

<key>2014-3-8</key>
<dict>
    <key>moonrise</key>
    <string>11:39 am</string>
    <key>moonset</key>
    <string>0:56 am</string>
    <key>phase</key>
    <string>First Quarter</string>
    <key>sunrise</key>
    <string>6:38 am</string>
    <key>sunset</key>
    <string>6:21 pm</string>
</dict>

<key>2014-3-9</key>
<dict>
    <key>moonrise</key>
    <string>1:28 pm</string>
    <key>moonset</key>
    <string>2:45 am</string>
    <key>phase</key>
    <string></string>
    <key>sunrise</key>
    <string>7:37 am</string>
    <key>sunset</key>
    <string>7:22 pm</string>
</dict>

该数据通过循环创建从日期字符串日期开始,昨天和结束,明天,所以在这种情况下,它开始于7日或三月九日结束处理,我们正在与给定日期中的每个的plist项目中的值工作一个名为iDay字典。

NSString *eventString;
NSDate *moonrise;
NSDate *moonset;
NSString *dateFormatString = @"yyyy-MM-dd h:mm a";

if ([iDay objectForKey:@"moonrise"] != nil) {
    eventString = [NSString stringWithFormat:@"%@ %@", dateString, [iDay objectForKey:@"moonrise"]];
    moonrise = [self.dateTime makeDateFromString:eventString
                                          format:dateFormatString];
}

if ([iDay objectForKey:@"moonset"] != nil) {
    eventString = [NSString stringWithFormat:@"%@ %@",dateString, [iDay objectForKey:@"moonset"]];
    moonset = [self.dateTime makeDateFromString:eventString
                                         format:dateFormatString];
}

该字符串传递给[self.dateTime makeDateFromString]通过这些说法是这样的:

2014年3月7日上午10时51分

2014年3月7日上午12时03分

2014年3月8日11:39

2014年3月8日上午12时56

2014年3月9日下午1时28

2014年3月9日凌晨2:45

好的。 现在的日期时间单:

+(ADateTimeClass *) sharedDateTime {
    @synchronized(self)
    {
        if (sharedInstance == NULL)
            sharedInstance = [[self alloc] init];
    }
    return sharedInstance;
}

-(id) init{
    self = [super init];
    if(self){
        self.dateFormat = [NSDateFormatter new];
        self.dateFormat.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    }
    return self;
}

...并在这一切发生可怕的事情的方法。 所有传递给此方法的字符串得到正确返回除了最后一个日期,我已经选中,零是来自“[DATEFORMAT dateFromString:dateString]”这里哪里dateString是六我上面列出的一个。

-(NSDate*) makeDateFromString:(NSString *)dateString format:(NSString *)format{
    [dateFormat setDateFormat:format];
    NSDate* aDate = [dateFormat dateFromString:dateString];
    return aDate;
}

其结果:

月出的印刷说明:2014年3月7日十四时51分00秒+0000

月落的印刷说明:2014年3月7日4点03分00秒+0000

月出的印刷说明:2014年3月8日15:39:00 +0000

月落的印刷说明:2014年3月8日四点56分00秒+0000

月出的印刷说明:2014年3月9日16:28:00 +0000

打印月落的描述:<零> <------------ !!!!!! 咦???

Answer 1:

这取决于你住的地方实际上是一个简单的问题。 至少在美国,从2014年3月9日凌晨2点和凌晨2:59之间的任何时间将不存在因夏令时的变化。 因此,任何这样的日期是无效的。



文章来源: iOS NSDateFormatter dateFromString returns nil only in one instance