2016-03-24 8 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〜4日です。 – Sulthan

+0

OK、私は理解できますが、夏時間は現在の日付との相対的なものです。ただし、時間間隔は現在の日付とは関係ありません。そうでなければ、私が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

クール、ありがとう、@スルタン - これは本当に助けて! – Maris

+0

これでも閏年とうるう秒の問題は解決しないことに注意してください。夏時間は避けられます。したがって、今年の現在の日とあなたの時間間隔の長さによっては、間違った結果が得られます。 –