Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS NSDateFormatter dateFromString仅在一个实例中返回nil_Ios_Objective C_Nsdateformatter - Fatal编程技术网

iOS NSDateFormatter dateFromString仅在一个实例中返回nil

iOS NSDateFormatter dateFromString仅在一个实例中返回nil,ios,objective-c,nsdateformatter,Ios,Objective C,Nsdateformatter,NSDateFormatter是否有意外返回零的倾向?我想不会的。 我希望我忽略了一些微小的细节,无论出于什么原因我都看不见 我有一些描述太阳和月亮的数据。它列在下面。 我还有一个循环,一旦数据从plist加载到字典中,它就会对数据进行迭代。 最后,我有一个类,它使用NSDateFormatter作为单例为我处理日期。 这个过程运行得很好,这些方法在一两个月内一直相互作用并生成正确的日期,但今天它崩溃了。除了最后一个为nil的字符串外,正在创建并通过这个简单过程传递的所有字符串都正确地转换为日期

NSDateFormatter是否有意外返回零的倾向?我想不会的。 我希望我忽略了一些微小的细节,无论出于什么原因我都看不见

我有一些描述太阳和月亮的数据。它列在下面。 我还有一个循环,一旦数据从plist加载到字典中,它就会对数据进行迭代。 最后,我有一个类,它使用NSDateFormatter作为单例为我处理日期。 这个过程运行得很好,这些方法在一两个月内一直相互作用并生成正确的日期,但今天它崩溃了。除了最后一个为nil的字符串外,正在创建并通过这个简单过程传递的所有字符串都正确地转换为日期。 发生的事情如下:

这是属性列表中的数据

<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>
这些语句传递给[self.dateTime makeDateFromString]的字符串如下所示:

2014-3-7上午10:51

2014-3-7上午0:03

2014-3-8上午11:39

2014-3-8上午0:56

2014-3-9下午1:28

2014-3-9凌晨2:45

好的,很好。现在是dateTime单例:

+(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;
}
。。。而这种方法让一切都变得非常糟糕。传递给此方法的所有字符串都以日期的形式正确返回,最后一个除外,我已经检查过,nil来自“[dateFormat dateFromString:dateString]”,这里的dateString是我上面列出的六个字符串之一

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

月出打印说明:2014-03-07 14:51:00+0000

卫星集打印说明:2014-03-07 04:03:00+0000

月出打印说明:2014-03-08 15:39:00+0000

卫星集打印说明:2014-03-08 04:56:00+0000

月出打印说明:2014-03-09 16:28:00+0000


打印月落的描述:这是一个简单的问题,实际上取决于你住在哪里。至少在美国,由于夏令时的变化,2014年3月9日凌晨2点到2:59点之间的任何时间都不存在。因此,任何这样的日期都是无效的。

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

您是否可以显示导致此问题的确切实例(并可能将那些与创建日期一起工作的实例)?类似于
NSLog(@“datefrom\“%@”是\“%@\”,字符串,日期)从您的输入(2014-3-7 10:51 am)和相应的输出(2014-03-07 14:51:00+0000)来看,您似乎没有使用由
sharedDateTime
创建的日期格式化程序,因此没有在UTC中进行转换。您好。是的,我明白你的意思。我需要再检查一下。很明显,rmaddy是对的,我聪明地忘记了DST。谢谢你指出不一致的地方。我会回复的。是的,时区是错误的,但我给你的这些值也是错误的。例程将返回匹配的日期,如10:51==10:51,但新日期标记为AST或ADT,唯一的失败是丢失的时间正好在那里的日期。您是否也可以显示导致此问题的确切实例(并可能将那些与创建的日期一起工作的实例)?类似于
NSLog(@“datefrom\“%@”是\“%@\”,字符串,日期)从您的输入(2014-3-7 10:51 am)和相应的输出(2014-03-07 14:51:00+0000)来看,您似乎没有使用由
sharedDateTime
创建的日期格式化程序,因此没有在UTC中进行转换。您好。是的,我明白你的意思。我需要再检查一下。很明显,rmaddy是对的,我聪明地忘记了DST。谢谢你指出不一致的地方。我会回复的。是的,时区是错误的,但我给你的这些值也是错误的。该例程将返回匹配的日期,如10:51==10:51,但新日期标记为AST或ADT,唯一的失败是丢失的时间正好在那里的日期。不幸的是,在中也讨论了,似乎没有很好的方法检测到这一点,因为您需要一个日期来测试它是否为DST。似乎我需要a)通过使用NSCalendar以一种不必要的精心设计的方式考虑DST,b)确保我真的在使用UTC。您需要将日期格式化程序设置为locale en_US_POSIX,以防止用户首选项的干扰。@NFG:对于日期计算,您应该始终使用日历,因为日历将时间点(由NSDate实例表示)转换为有意义的时间和日期。它是一个知道天数的日历,而不是nsdate对象。@NFC:另一个选项是在nsdate组件上进行所有计算。视频中也有介绍。不幸的是,在中也有讨论,似乎没有很好的方法来检测这一点,因为您需要一个日期来测试它,以确定它是否是DST。似乎我需要a)通过使用NSCalendar以一种不必要的精心设计的方式考虑DST,b)确保我真的在使用UTC。您需要将日期格式化程序设置为locale en_US_POSIX,以防止用户首选项的干扰。@NFG:对于日期计算,您应该始终使用日历,因为日历将时间点(由NSDate实例表示)转换为有意义的时间和日期。它是一个知道天数的日历,而不是nsdate对象。@NFC:另一个选项是在nsdate组件上进行所有计算。视频中也有报道。
-(NSDate*) makeDateFromString:(NSString *)dateString format:(NSString *)format{
    [dateFormat setDateFormat:format];
    NSDate* aDate = [dateFormat dateFromString:dateString];
    return aDate;
}