【问题标题】:JSON date to NSDate IssueJSON 日期到 NSDate 问题
【发布时间】:2013-05-18 21:29:00
【问题描述】:

我有一个 JSON 格式的日期字符串,它看起来像这样: 2013-05-22T10:54:40.437

我正在尝试将其转换为 NSDate。

- (NSString *)dateFromString:(NSString *)datestring{
    // Convert string to date object
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss"];

    NSDate *date = [dateFormat dateFromString:datestring];
    //date is nil here.
    NSDateFormatter *newDateFormatter = [[NSDateFormatter alloc]init];
    [newDateFormatter setDateFormat:@"MM/dd/yyyy"];
    NSString *newString = [newDateFormatter stringFromDate:date];
    NSLog(@"Date -- %@",datestring);


    return newString;
}

但是 dateFromString 之后的日期为零。有谁知道我在这里做错了什么? 谢谢!

【问题讨论】:

标签: objective-c json nsdate


【解决方案1】:

使用这种日期格式:

yyyy-MM-dd'T'HH:mm:ss.SSS

您的代码几乎没有修改:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS"];

NSDate *date = [dateFormat dateFromString:datestring];
NSDateFormatter *newDateFormatter = [[NSDateFormatter alloc]init];
[newDateFormatter setDateFormat:@"MM/dd/yyyy"];
NSString *newString = [newDateFormatter stringFromDate:date];
NSLog(@"Date: %@, formatted date: %@", date, newString);

给我这个输出:

Date: 2013-05-22 08:54:40 +0000, formatted date: 05/22/2013

编辑:“ikinci viking”如何在评论中指出,转义破折号是不必要的。从代码中去掉转义


iOS 11+ 更新

ISO8601DateFormatter 是在 iOS 10+ 上解析互联网日期的推荐方式。

但是,它几乎没有问题阻止它与问题中的特定格式一起使用:

  • 毫秒仅在 iOS 11+ 上受支持
  • 它不适用于没有时区的日期(有问题的情况)。日期字符串必须包含时区部分(例如,+00:00Z 表示“祖鲁时间”UTC)

如果日期字符串同时包含毫秒和时区(例如2018-09-07T14:04:13.143Z),则可以按如下方式使用(Swift 示例):

let isoDateFormatter = ISO8601DateFormatter()
isoDateFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]

【讨论】:

  • @ikinci viking:感谢您的指正。我只想做尽可能少的更改来修复问题中的代码。但你是对的,它在不转义的情况下更具可读性
  • 如何进行相反的操作? NSDate 到 JSON 字符串的正确方式?
【解决方案2】:

您的日期格式不正确。应该是:

[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss:SSS"];

三个大写的“S”表示它将小数部分取为 3 位数字。随意调整。

【讨论】:

    【解决方案3】:
    If your date format is "2014-02-25T13:05:10+00:00" then,
    your code should be like this....
    
        NSURL *url = [NSURL URLWithString:@"your URL"];
        NSString *str = [[NSString alloc] initWithContentsOfURL:url usedEncoding:Nil error:Nil];
    
        NSDateFormatter *dateFor = [[NSDateFormatter alloc] init];
        [dateFor setDateFormat:**@"yyyy-MM-dd'T'HH:mm:ss'+'SS:SS"**];
    
        NSDate *yourDate = [dateFor dateFromString:str];
        NSLog(@"Your Date: %@",yourDate);
    

    【讨论】:

      【解决方案4】:
      -(void)viewDidLoad {
      
          self.date = [dateForRFC3339DateTimeString:@"2015-01-18T01:00:00.000Z"];
      
      }
      
      
      -(NSDate *)dateForRFC3339DateTimeString:(NSString *)rfc3339DateTimeString {
      
          NSDateFormatter *rfc3339DateFormatter = [[NSDateFormatter alloc] init];
      
          [rfc3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'"];
          [rfc3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
      
          // Convert the RFC 3339 date time string to a NSDate.
          NSDate *result = [rfc3339DateFormatter dateFromString:rfc3339DateTimeString];
          return result;
      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-30
        • 1970-01-01
        • 2015-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-30
        • 1970-01-01
        相关资源
        最近更新 更多