【问题标题】:How to convert string to date?如何将字符串转换为日期?
【发布时间】:2013-08-26 07:13:55
【问题描述】:

我知道这里有很多与此主题有关的问题。但是,我似乎无法解决我的问题。

我有这个字符串,例如“2013-08-26 12:11:51 10:17:25”,我只想抓取“2013-08-26”,然后将其转换回字符串.我尝试了很多方法都没有成功:

NSMutableString *visitDate = [[NSMutableString alloc] initWithString:@"2013-08-26 10:17:25"];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd"];
NSDate *date = [dateFormat dateFromString:visitDate];
NSLog(@"date: %@", date);
NSMutableString *returnConvertedDateString = [[NSMutableString alloc]initWithString:(NSMutableString *)date];    
NSLog(@"converted string: %@", returnConvertedDateString);

上面NSLog语句的结果是:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSPlaceholderMutableString initWithString:]: nil argument'

我也试过了:

-  (NSMutableString *) convertDateToString : (NSMutableString *)visitDate{
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *components = [calendar components:units fromDate:(NSDate *)visitDate];
NSMutableString *returnConvertedDateString = [[NSMutableString alloc]initWithFormat:@"%ld-%ld-%ld", (long)[components year], (long)[components month],(long)[components day]];
return returnConvertedDateString;
}

【问题讨论】:

  • NSLog 语句的结果是什么?
  • 是否有理由转换为日期并返回字符串?从你的问题看来,一个简单的正则表达式提取就可以完成这项工作......
  • 它给出了一个错误。 “由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'*** -[NSPlaceholderMutableString initWithString:]: nil argument'”
  • 尝试用 NSString 初始化时间字符串。像 NSString *visitDate = @"2013-08-26 12:11:51";显然删除了最后一部分。谢谢@CarlVeazey。
  • 您的输入字符串没有任何意义。那是什么日期格式?

标签: ios objective-c nsstring nsdate nsdateformatter


【解决方案1】:

您的字符串中有重复的时间。假设这是一个错字,你可以像这样得到你想要的。

NSDateFormatter * dateFormatter = [NSDateFormatter new];

[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSDate * date = [dateFormatter dateFromString:@"2013-08-26 12:11:51"];

[dateFormatter setDateFormat:@"yyyy-MM-dd"];

NSString * dateString = [dateFormatter stringFromDate:date];

NSLog(@"%@", dateString);

【讨论】:

  • 这太棒了。但是,您能否向我解释一下为什么我们需要 setDateFormat 两次?
  • 因为您使用它一次以使 NSDateFormatter 在将其转换为日期对象之前识别您的字符串,一旦您拥有日期对象,您再次使用它从日期中去除不必要的部分并转换它回到字符串。我看到大多数人为此使用两个 NSDateFormatter 对象,但您可以看到没有必要这样做,因为您可以以不同的格式重复使用它。
【解决方案2】:

假设日期时间字符串的格式为NSString *visitDate = @"2013-08-26 12:11:51 10:17:25";

试试这个方法:

-  (NSString *) convertDateToString:(NSString *)visitDate{
  NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(\d{4}-\d{2}-\d{2})" options:NSRegularExpressionCaseInsensitive error:NULL];
  NSTextCheckingResult *firstMatch = [regex firstMatchInString:opening_time options:0 range:NSMakeRange(0, [visitDate length])];
  if (firstMatch) {
      NSRange range = [firstMatch rangeAtIndex:0];
      NSString *dateString = [urlString substringWithRange:range];
      return dateString;
  }
  return nil;
}

此方法应仅提取字符串的yyyy-MM-dd 部分并以字符串表示形式返回。如果需要,记得将其修改为可变版本。

【讨论】:

    【解决方案3】:

    最简单的方法是

    NSMutableString *visitDate = [[NSMutableString alloc] initWithString:@"2013-08-26 12:11:51"];

        NSArray *items = [visitDate componentsSeparatedByString:@" "];
        NSLog(@"%@",[items objectAtIndex:0]);
    

    【讨论】:

      【解决方案4】:

      如果你想要一个字符串,为什么不只返回前 10 个字符?

      [dateString substringToIndex:10];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-24
        • 1970-01-01
        • 2023-02-06
        • 2016-11-10
        • 2015-04-27
        • 2011-11-28
        相关资源
        最近更新 更多