NSDateComponentsFormatter 增加了额外的时间
NSDateComponentsFormatter adds additional hour
我发现 NSDateComponentsFormatter 的行为相当奇怪 - 在某些时间间隔内,它只会在结果中增加一个小时。
我假设对于超过 1 年的时间间隔,它可以添加一个 "leap hour",但在这种情况下,我看到时间间隔短至 5 天结果为 5 天零一小时。
考虑这个测试用例:
func testStringFromTimeInterval()
{
let formatter = NSDateComponentsFormatter()
formatter.unitsStyle = .Positional
formatter.allowedUnits = [.Year, .Month, .WeekOfMonth, .Day, .Hour, .Minute]
XCTAssertEqual(formatter.stringFromTimeInterval(3600) ?? "", "1:00") // Pass
XCTAssertEqual(formatter.stringFromTimeInterval(3600*24) ?? "", "1d 0:00") // Pass
XCTAssertEqual(formatter.stringFromTimeInterval(3600*24*5) ?? "", "5d 0:00") // Fail: actual "5d 1:00"
XCTAssertEqual(formatter.stringFromTimeInterval(3600*24*365) ?? "", "1y 0m 0w 0d 0:00") // Pass
XCTAssertEqual(formatter.stringFromTimeInterval((3600*24*365)+60) ?? "", "1y 0m 0w 0d 0:01") // Pass
XCTAssertEqual(formatter.stringFromTimeInterval((3600*24*365)+3600) ?? "", "1y 0m 0w 0d 1:00") // Pass
XCTAssertEqual(formatter.stringFromTimeInterval((3600*24*365)+(3600*24)) ?? "", "1y 0m 0w 1d 0:00") // Pass
XCTAssertEqual(formatter.stringFromTimeInterval((3600*24*365)+(3600*24*5)) ?? "", "1y 0m 0w 5d 0:00") // Fail: actual "1y 0m 0w 5d 1:00"
}
你能帮忙找到避免增加 1 小时的方法吗?
谢谢!
马里斯
这是由于几天后欧洲发生夏令时变化造成的。
我不确定这是否是间隔格式化程序的预期行为(这看起来确实有点奇怪)。但是,对于所有时区问题,您可以通过将时区设置为特定的 GMT 时区来修复它。在这种情况下 GMT-00:00
可能是预期的时区:
let formatter = NSDateComponentsFormatter()
formatter.unitsStyle = .Positional
formatter.allowedUnits = [.Year, .Month, .WeekOfMonth, .Day, .Hour, .Minute]
let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
calendar.locale = NSLocale.currentLocale()
calendar.timeZone = NSTimeZone(forSecondsFromGMT: 0)
formatter.calendar = calendar
print(formatter.stringFromTimeInterval(3600)) // "1:00"
print(formatter.stringFromTimeInterval(3600*24)) // "1d 0:00"
print(formatter.stringFromTimeInterval(3600*24*5)) // "5d 0:00"
print(formatter.stringFromTimeInterval(3600*24*365)) // "1y 0m 0w 0d 0:00"
我发现 NSDateComponentsFormatter 的行为相当奇怪 - 在某些时间间隔内,它只会在结果中增加一个小时。
我假设对于超过 1 年的时间间隔,它可以添加一个 "leap hour",但在这种情况下,我看到时间间隔短至 5 天结果为 5 天零一小时。
考虑这个测试用例:
func testStringFromTimeInterval()
{
let formatter = NSDateComponentsFormatter()
formatter.unitsStyle = .Positional
formatter.allowedUnits = [.Year, .Month, .WeekOfMonth, .Day, .Hour, .Minute]
XCTAssertEqual(formatter.stringFromTimeInterval(3600) ?? "", "1:00") // Pass
XCTAssertEqual(formatter.stringFromTimeInterval(3600*24) ?? "", "1d 0:00") // Pass
XCTAssertEqual(formatter.stringFromTimeInterval(3600*24*5) ?? "", "5d 0:00") // Fail: actual "5d 1:00"
XCTAssertEqual(formatter.stringFromTimeInterval(3600*24*365) ?? "", "1y 0m 0w 0d 0:00") // Pass
XCTAssertEqual(formatter.stringFromTimeInterval((3600*24*365)+60) ?? "", "1y 0m 0w 0d 0:01") // Pass
XCTAssertEqual(formatter.stringFromTimeInterval((3600*24*365)+3600) ?? "", "1y 0m 0w 0d 1:00") // Pass
XCTAssertEqual(formatter.stringFromTimeInterval((3600*24*365)+(3600*24)) ?? "", "1y 0m 0w 1d 0:00") // Pass
XCTAssertEqual(formatter.stringFromTimeInterval((3600*24*365)+(3600*24*5)) ?? "", "1y 0m 0w 5d 0:00") // Fail: actual "1y 0m 0w 5d 1:00"
}
你能帮忙找到避免增加 1 小时的方法吗?
谢谢!
马里斯
这是由于几天后欧洲发生夏令时变化造成的。
我不确定这是否是间隔格式化程序的预期行为(这看起来确实有点奇怪)。但是,对于所有时区问题,您可以通过将时区设置为特定的 GMT 时区来修复它。在这种情况下 GMT-00:00
可能是预期的时区:
let formatter = NSDateComponentsFormatter()
formatter.unitsStyle = .Positional
formatter.allowedUnits = [.Year, .Month, .WeekOfMonth, .Day, .Hour, .Minute]
let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
calendar.locale = NSLocale.currentLocale()
calendar.timeZone = NSTimeZone(forSecondsFromGMT: 0)
formatter.calendar = calendar
print(formatter.stringFromTimeInterval(3600)) // "1:00"
print(formatter.stringFromTimeInterval(3600*24)) // "1d 0:00"
print(formatter.stringFromTimeInterval(3600*24*5)) // "5d 0:00"
print(formatter.stringFromTimeInterval(3600*24*365)) // "1y 0m 0w 0d 0:00"