【问题标题】:Format Duration as ISO8601 Period with NSDateIntervalFormatter使用 NSDateIntervalFormatter 将持续时间格式化为 ISO8601 周期
【发布时间】:2015-03-05 22:01:01
【问题描述】:

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

【问题讨论】:

  • 如果你能告诉我们输入是什么会有帮助!!!
  • 但我不认为 N​​SDateIntervalFormatter 做你想做的事。 “日期间隔由两个日期定义,例如,2013 年 9 月 1 日 - 2013 年 10 月 1 日。”

标签: objective-c iso8601 nsformatter


【解决方案1】:

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

要在你需要使用NSCalendarNSDateComponentsstringWithFormat:(或类似名称)之后得到你想要的东西。

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

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

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

HTH

【讨论】:

    【解决方案2】:

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

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

    您可以使用NSDateComponentsFormatter 来格式化持续时间。不过不知道是否支持你想要的具体格式。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-23
      • 2021-08-13
      • 2022-09-28
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多