-1

我正在尝试将两个日期之间的持续时间转换为格式"'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;
}

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

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

4

2 回答 2

1

你误解了什么NSDateIntervalFormatter是为了。它用于将间隔格式化为start - end形式的字符串。

它不是用于格式化持续时间。

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

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

于 2015-03-05T22:33:14.100 回答
1

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

NSCalendar要在需要使用,NSDateComponentsstringWithFormat:(或类似的)之后得到你想要的东西。

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

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

  • 最后使用stringWithFormat:根据需要格式化组件。

高温高压

于 2015-03-05T22:31:15.957 回答