代码之家  ›  专栏  ›  技术社区  ›  bradley.ayers

在objective-c(iphone操作系统sdk)中解析iso8601日期

  •  7
  • bradley.ayers  · 技术社区  · 15 年前

    如何将“2010-04-30t00:45:48.711127”解析为nsdate?(并保持所有精度)

    3 回复  |  直到 14 年前
        1
  •  4
  •   Ashley Clark    15 年前

    你有你的工作要做。

    NSDate 将在几秒钟内抛出任何超过3个小数位的值。您可以创建 新西兰 要保持这种精度,还需要实现自己的解析和自定义格式化程序来输入和显示它,因为 NSDateFormatter CFDateFormatter 它还将在小数点后3位截断精度。但这并不难,要看你在做什么。

    这是一个简单的子类(不实现 NSCoding NSCopying )这将保持你给出的所有精度。

    @interface RMPreciseDate : NSDate {
        double secondsFromAbsoluteTime;
    }
    
    @end
    
    @implementation RMPreciseDate
    
    - (NSTimeInterval)timeIntervalSinceReferenceDate {
        return secondsFromAbsoluteTime;
    }
    
    - (id)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)secsToBeAdded {
        if (!(self = [super init]))
            return nil;
    
        secondsFromAbsoluteTime = secsToBeAdded;
    
        return self;
    }
    
    @end
    

    然后你可以要求 -timeIntervalSince1970 以获得unix纪元时间。

    有一个 ISO8601 date/time parser class 已经在外面了,但是因为它在使用 NSDateComponents 要生成它的日期,当前的精度限制为完全秒级,但您可以将其用作起点,也许可以创建更精确的表示。

        2
  •  0
  •   Peter DeWeese    14 年前

    在类似的情况下,我将尝试使用这个iso 8601解析器和unparser: http://boredzo.org/iso8601parser/

        3
  •  -1
  •   WineSoaked    15 年前

    看起来nsdate的精度只有毫秒。

    #import <Foundation/Foundation.h>
    
    int main (int argc, const char * argv[]) {
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy-MM-dd'T'hh:mm:ss.SSSSSS"];
    
        NSDate *date = [dateFormatter dateFromString:@"2010-04-30T00:45:48.711127"];
    
        NSLog(@"%@", date);
    
        NSString *string = [dateFormatter stringFromDate:date];
    
        NSLog(@"%@", string);
    
        [pool drain];
        return 0;
    }
    

    该代码生成以下控制台输出:

    Program loaded.
    run
    [Switching to process 27202]
    Running…
    2010-05-08 20:02:46.342 TestNSDate[27202:a0f] 2010-04-30 00:45:48 -0700
    2010-05-08 20:02:46.344 TestNSDate[27202:a0f] 2010-04-30T12:45:48.711000
    
    Debugger stopped.
    Program exited with status value:0.
    

    所以 "2010-04-30T00:45:48.711127" 变成 "2010-04-30T00:45:48.711000" 可能不是你想的那样。