使用 NSDateIntervalFormatter 将持续时间格式化为 ISO8601 期间
Format Duration as ISO8601 Period with NSDateIntervalFormatter
我正在尝试将两个日期之间的持续时间转换为 "'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
是3/5/2015,16:46:20.3。如果我将格式化程序的语言环境设置为 nil
并将日期和时间格式设置为 NSDateIntervalFormatterFullStyle
,则 duration
具有以下格式:Thursday , 2015 年 3 月 5 日,4:51:36 下午 GMT-05:00 - 2015 年 3 月 5 日,星期四,4:52:01 下午 GMT-05:00.
如何使用 ISO8601 句点格式(或至少为 "'P'yyyy'Y'M'M'd'DT'H'H'm' 格式化两个日期之间的持续时间M's.S'S')?
您正在使用的 class NSDateIntervalFormatter
旨在生成 间隔 形式 date1 - date2, 没有格式化两个日期之间的时间差。
要在需要使用 NSCalendar
、NSDateComponents
和 stringWithFormat:
(或类似的)之后得到你想要的东西。
首先你需要一个日历,[NSCalendar currentCalendar]
是个不错的选择。 (当以特定日历的单位表示时,两个绝对时间点之间的差异可能不同 - 如果这没有意义,请不要担心,只需使用 currentCalendar
!)
接下来使用components:fromDate:toDate:options:
方法获取NSDateComponents
的实例,其中包含两个日期之间的年数、天数、小时数等。
最后使用stringWithFormat:
按照自己的意愿格式化组件。
HTH
您误解了 NSDateIntervalFormatter
的含义。它用于将间隔格式化为 start - end.
形式的字符串
它不是用于格式化持续时间。
您可以使用 NSDateComponentsFormatter
来格式化持续时间。但是不知道是否支持你想要的具体格式
它有方便的方法-stringFromDate:toDate:
和-stringFromTimeInterval:
。
我正在尝试将两个日期之间的持续时间转换为 "'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
是3/5/2015,16:46:20.3。如果我将格式化程序的语言环境设置为 nil
并将日期和时间格式设置为 NSDateIntervalFormatterFullStyle
,则 duration
具有以下格式:Thursday , 2015 年 3 月 5 日,4:51:36 下午 GMT-05:00 - 2015 年 3 月 5 日,星期四,4:52:01 下午 GMT-05:00.
如何使用 ISO8601 句点格式(或至少为 "'P'yyyy'Y'M'M'd'DT'H'H'm' 格式化两个日期之间的持续时间M's.S'S')?
您正在使用的 class NSDateIntervalFormatter
旨在生成 间隔 形式 date1 - date2, 没有格式化两个日期之间的时间差。
要在需要使用 NSCalendar
、NSDateComponents
和 stringWithFormat:
(或类似的)之后得到你想要的东西。
首先你需要一个日历,
[NSCalendar currentCalendar]
是个不错的选择。 (当以特定日历的单位表示时,两个绝对时间点之间的差异可能不同 - 如果这没有意义,请不要担心,只需使用currentCalendar
!)接下来使用
components:fromDate:toDate:options:
方法获取NSDateComponents
的实例,其中包含两个日期之间的年数、天数、小时数等。最后使用
stringWithFormat:
按照自己的意愿格式化组件。
HTH
您误解了 NSDateIntervalFormatter
的含义。它用于将间隔格式化为 start - end.
它不是用于格式化持续时间。
您可以使用 NSDateComponentsFormatter
来格式化持续时间。但是不知道是否支持你想要的具体格式
它有方便的方法-stringFromDate:toDate:
和-stringFromTimeInterval:
。