Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.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
Iphone 关于NSDateFormatter的困惑_Iphone_Ios_Nsdate_Nsdateformatter_Ios5.1 - Fatal编程技术网

Iphone 关于NSDateFormatter的困惑

Iphone 关于NSDateFormatter的困惑,iphone,ios,nsdate,nsdateformatter,ios5.1,Iphone,Ios,Nsdate,Nsdateformatter,Ios5.1,更新:我能够将日期从服务器json转换为2012/09/05 10:45 NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setDateFormat:@"YYYY-MM-dd HH:mm:ss"];

更新:我能够将日期从服务器json转换为2012/09/05 10:45

    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSDateFormatter *df = [[NSDateFormatter alloc] init];
         [df setDateFormat:@"YYYY-MM-dd HH:mm:ss"];


    for (NSString *slotKey in myslots.allKeys) {
        NSDictionary *slot = [myslots valueForKey:slotKey];

        for (myDays in slot){

            if ([[self.myDays objectForKey:@"isReservable"] isEqualToNumber:[NSNumber numberWithInt:1]]){

                NSDate *newDate = [df dateFromString:[self.myDays objectForKey:@"begin"]];
                if (newDate){
                    [self.timesArray addObject:newDate];

                }
                NSLog(@"these are the returned newdates: %@",newDate);
                NSLog(@"This is the timesArray: %@", self.timesArray);
            }


        }        
    }
其中我的NSLog仍然返回null,我的This is timesArray is()
我不明白出了什么问题。谢谢您的帮助。

您确定您的输入有效吗

而且,您的第一个日志只说明日期格式化程序已分配,而不是它将为您的输入生成结果

运行了一个快速测试,您的问题似乎出现在日期的时区部分。以下代码将返回:
日期为2012-10-04 16:15:00+0000

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"YYYY-MM-dd HH:mm:ss V"];
NSDate* date = [df dateFromString:@"2012-10-04 09:15:00 PT"];
NSLog(@"date is %@", date);
可以显式检查日期格式化程序是否可以从字符串中获取日期,如下所示:

    __autoreleasing NSDate* date2 = nil;
    NSRange dateRange = NSMakeRange(0, [@"2012-10-04 09:15:00 PT" length]);
    __autoreleasing NSError* err = nil;

    BOOL canMakeDate = [df getObjectValue:&date2 forString:@"2012-10-04 09:15:00 PT" range:&dateRange error:&err];
    NSLog(@"could get a date %@, from range %@. Got %@", canMakeDate ? @"YES" : @"NO", NSStringFromRange(dateRange), date2);

由于日期字符串来自服务器端,我建议您调查它是如何发送时区的,并在您端手动更改它们。不漂亮,但regex是您的朋友。

dateFromString:
在无法将字符串转换为日期时返回
nil
。您的
V
格式匹配通用非位置格式的时区,如太平洋时间的“PT”。您提供的描述时区的内容完全不同,因此对格式化程序来说是胡言乱语

我相信这是一种
NSTimezone
可以理解的格式,因此您可以提取字符串,创建
NSTimezone
,使用该格式获取UTC的偏移量,然后根据需要将“America/Los_Angeles”替换为“-0700”或“-0800”,然后使用“Z”格式说明符将其解析出来


有关日期格式的详细信息,请参阅。

在日期格式中使用
YYYY
,这是需要注意的一件事
YYYY
yyy
不同

YYYY
=年(在基于“一年中的一周”的日历中)。该年名称用于ISO 8601定义的ISO年-周日历,但可用于需要周日期处理的非公历日历系统。可能并不总是与日历年的值相同

yyyy
=以2012年(公历)格式返回年份


您还指定您的时区将采用短格式
V
(PT),请尝试使用长格式
vvv
美国(洛杉矶)

我想是的,我如何检查以确保?Unicode规范可用我会将self.myDays objectForKey放在2012-10-04 09:15:00 PT所在的位置?没有向NSArray添加任何内容,因为日期格式化程序正在对您的输入进行格式化,并给您零而不是返回NSDate。看看我更新的答案,像这样?NSDateFormatter*df=[[NSDateFormatter alloc]init];[df setDateFormat:@“YYYY-MM-dd HH:MM:ss V”];[df setTimeZone:[NSTimeZone systemTimeZone]];否。服务器发送的时区不太可能是您的系统时区。设置格式化程序时区只是在日期字符串本身不提供默认TZ信息的情况下提供默认TZ信息。我也发现了这一点:NSTimezone:请注意,严格来说,时区数据库条目(如“America/Los_Angeles”)不是ID名称。时区名称的一个示例是“太平洋夏令时”。尽管许多NSTimeZone方法名称包含单词“name”,但它们引用的是ID。这就是为什么NSTimeZone是您想要的。它可以将这些ID转换为UTC的偏移量,也可以转换为专有名称。尝试解决方案时仍然为空