2016-03-24 68 views
0

我發現NSDateComponentsFormatter的行爲非常奇怪 - 對於一些時間間隔它只是增加了一小時的結果。NSDateComponentsFormatter增加了額外的小時

我假設對於1年以上的時間間隔,它可能會增加一個「閏秒」,但在這種情況下,我會將短至5天的時間間隔看作5天和1小時。

考慮這個測試用例:

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時間?

謝謝!

馬里斯

+0

歡迎來到夏令時......這是3月份,您可能在歐洲。這意味着從夏令時改變開始大約需要3-4天。 – Sulthan

+0

好的,我可以理解,但夏令時相對於當前日期。但是,時間間隔不應與當前日期相關聯。否則,如果我假設我已經完成了5天的項目,那麼在某個時候,當我看這個數字時,我會看到我已經在5天和1小時的時間內完成了項目。不知何故不一致... – Maris

回答

0

這是由日光節約時間的變化恰好在歐洲在幾天之內引起的。 我不確定這是否是間隔格式化程序的預期行爲(它絕對看起來有點奇怪)。但是,作爲所有時區問題,您可以通過將時區設置爲特定的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" 
+0

很酷,謝謝,@Sulthan - 這真的很有幫助! – Maris

+0

被警告,這仍然不能解決閏年和閏秒的問題,它只能避免DST。因此,根據當年的當天和時間間隔的長短,您仍然可能得到錯誤的結果。 –