格式持续时间为ISO8601期间,带有NSDateIntervalFormatter

时间:2015-03-05 22:01:02

标签: objective-c iso8601 nsformatter

我正在尝试将两个日期之间的持续时间转换为"'P'yyyy'Y'M'M'd'DT'H'H'm'M's.S'S'"格式。我预期输出的一个示例是:P0Y0M0DT0H0M0.002S(这是使用 DurationFormatUtils 的Android项目的端口。)

我的测试用例:

NSDateIntervalFormatter *durationFormatter = [NSDateIntervalFormatter durationFormatter];
NSDate *date = [NSDate date];
NSDate *end = [date dateByAddingTimeInterval:25];
NSString *duration = [durationFormatter stringFromDate:date toDate:end];
XCTAssertTrue( [duration hasPrefix:@"P"], @"Actual String: %@", duration );

我的格式化程序定义为:

+ (NSDateIntervalFormatter*) durationFormatter {
    static NSDateIntervalFormatter *formatter = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        formatter = [[NSDateIntervalFormatter alloc] init];
        formatter.dateTemplate = @"'P'yyyy'Y'M'M'd'DT'H'H'm'M's.S'S'";
    });

    return formatter;
}

运营时,duration 2015年5月5日,16:46:20.3 。如果我将格式化程序上的区域设置设置为nil并将日期和时间格式设置为NSDateIntervalFormatterFullStyle,则duration具有以下格式: 3月5日星期四, 2015年,格林威治标准时间-05:00下午4:51:36 - 2015年3月5日星期四,格林威治标准时间-05:00下午4:52:01

如何使用ISO8601期间格式格式化两个日期之间的持续时间(或至少为“'P'yyyy'Y'M'M'd'DT'H'H'm'M's.S'S' “)?

2 个答案:

答案 0 :(得分:1)

您正在使用的课程NSDateIntervalFormatter旨在生成 date1 - date2 形式的间隔,而不是格式化两个日期之间的时差。

在您需要使用NSCalendarNSDateComponentsstringWithFormat:(或类似)后,了解您的情况。

  • 首先你需要一个日历,[NSCalendar currentCalendar]是个不错的选择。 (当以特定日历为单位表示时,两个绝对点之间的差异可能会有所不同 - 如果没有意义,请不要担心,只需使用currentCalendar!)

  • 接下来,使用components:fromDate:toDate:options:方法获取NSDateComponents的实例,其中包含两个日期之间的年数,天数,小时数等。

  • 最后使用stringWithFormat:按照您的意愿格式化组件。

HTH

答案 1 :(得分:1)

您误解了NSDateIntervalFormatter的用途。它用于将间隔格式化为 start - end 形式的字符串。

不是格式化持续时间。

您可以使用NSDateComponentsFormatter格式化持续时间。但是,我不知道它是否支持您想要的特定格式。

它有方便的方法-stringFromDate:toDate:-stringFromTimeInterval: