为什么NSDateFormatter的dateFromString返回nil?

问题描述:

我有这个字符串被传递给此方法生产的2倍:为什么NSDateFormatter的dateFromString返回nil?

周一至周五7:00 AM - 10:00 PM

-(void)dealWithTimeStrings2:(NSString*)timeString{ 
    NSString *s = timeString; 

    NSCharacterSet *digits = [NSCharacterSet decimalDigitCharacterSet]; 
    int idx = [s rangeOfCharacterFromSet:digits].location; 
    NSString *timeStr = [s substringFromIndex:idx]; 
    NSArray *timeStringsArray2 = [timeStr componentsSeparatedByString:@" - "]; 
    NSLog(@"timeStringsArray2 %@", timeStringsArray2); 

    //NOW TURN INTO DATE AND FORMAT TO 24HR 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"HH:mm a"]; 
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"CST"]]; 

    NSString *openDateString = (NSString*)[timeStringsArray2 objectAtIndex:0]; 
    NSString *closeDateString = (NSString*)[timeStringsArray2 objectAtIndex:1]; 
    NSLog(@"someDateString %@,%@", openDateString,closeDateString); 

    NSDate *openDate = [dateFormatter dateFromString:openDateString]; 
    NSDate *closeDate = [dateFormatter dateFromString:closeDateString]; 

    NSLog(@"open, now, close %@,%@,%@", openDate,[NSDate date],closeDate); 

} 

并且这产生:

timeStringsArray2( “7:00 AM”, “10:00 PM”)

someDateString 7:00 AM,10:00 PM

open,now,close 2000-01-01 13:00:00 + 0000,2013-07-24 23:51:55 + 0000,2000-01-02 04:00:00 +0000

下面是测试代码:

-(BOOL)timeCompare:(NSDate*)date1 until:(NSDate*)date2{ 
    NSDate *now = [NSDate date]; 
    BOOL inBetween = ([now compare:date1] == NSOrderedDescending && [now compare:date2] == NSOrderedAscending); 

    return inBetween; 
} 

正如你所看到的,23:46是不是6:00至18:00之间。然而,我只是在我上午7点到下午10点之间的时间跑完这段时间。

+0

像“7:30 AM”这样的字符串与格式“HH:mm”不匹配。你需要'hh:mm a'。 – rmaddy

+0

那么我做到了,但有人告诉我,这是造成转换时区的问题。因为从上午7:00&10:00 PM 我得到2000-01-01 00:00:00 +0000&2000-01-01 12:00:00 +0000这是不正确的! – marciokoko

+2

'NSDate'对象始终使用UTC,当您记录它们时,您将看到它们是UTC,而不是本地时间。 – rmaddy

你根本不需要日期或日期格式化程序。您可以使用字符串处理代码读取时间以获取小时和分钟信息。然后可以获取当前日期的日期组件以与之比较。

+0

你的意思是这样的:'http:// *.com/questions/3385552/nsdatecomponents-componentsfromdate-and-time-zones' – marciokoko

+0

Ish。您不想执行时区内容,因为您希望获取用户语言环境时区中的当前小时和分钟。因此,除了从用户当前日历中获取组件外,您无需执行任何操作。 – Wain