【问题标题】:Why does NSDateFormatter dateFromString return nil?为什么 NSDateFormatter dateFromString 返回 nil?
【发布时间】:2013-07-24 22:35:17
【问题描述】:

我有这个字符串被传递给这个方法以产生 2 次:

周一至周五上午 7:00 至晚上 10:00

-(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”)

someDateString 上午 7:00,晚上 10:00

开,现在,关 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 之间。但是,我只是在我的时间 5:46 运行此程序,即在上午 7:00 到晚上 10:00 之间。

【问题讨论】:

  • 7:30 AM 这样的字符串与HH:mm 的格式不匹配。你需要hh:mm a
  • 好吧,我做到了,但有人告诉我这导致了转换时区的问题。因为从上午 7:00 和晚上 10:00 我得到 2000-01-01 00:00:00 +0000 和 2000-01-01 12:00:00 +0000 这是不正确的!
  • NSDate 对象始终采用 UTC,当您记录它们时,您会看到它们采用 UTC,而不是语言环境时间。
  • 谁告诉你关于时区的事情并不知道他们的axx是从地上的一个洞里得到的。事实是您没有“时区问题”,您有“时区理解问题”。 NSDate 总是包含 GMT 时间,NSLog 会打印那个 GMT 时间。
  • 糟糕——我的意思是“本地时间”,而不是“本地时间”。后者没有多大意义。

标签: ios nsdateformatter


【解决方案1】:

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

【讨论】:

  • 你的意思是这样的:http://stackoverflow.com/questions/3385552/nsdatecomponents-componentsfromdate-and-time-zones
  • 伊什。您不想做时区的事情,因为您想在用户区域设置时区中获取当前小时和分钟。因此,除了从用户当前日历中获取组件之外,您无需执行任何操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
相关资源
最近更新 更多