2016-03-24 26 views
0

NSDateComponentsFormatter'ın oldukça garip bir davranışını buldum - bazı zaman aralıklarında sonuç için yalnızca ek saat ekler.NSDateComponentsFormatter ek saat ekler

1 yıl boyunca zaman aralıklarında bir "atlama saati" ekleyebiliriz, ancak bu durumda 5 güne kadar olan zaman aralığını 5 gün ve bir saat olarak görüyorum.

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" 
} 

sen 1 saat ifade ederek önlemek için bir yol bulmaya yardım edebilir:

bu Test Case düşünün?

Teşekkürler!

Maris

+0

Gün ışığından yararlanma saatine hoş geldiniz ... Mart ve muhtemelen Avrupa'dasınız. Bu, Yaz saati uygulamasından yaklaşık 3-4 gün geçtiğiniz anlamına gelir. – Sulthan

+0

Tamam, bunu anlayabiliyorum ama gün ışığından yararlanma saati geçerli tarihe göre. Bununla birlikte, zaman aralığı güncel tarihe bağlı olmamalıdır. Aksi takdirde, 5 gün boyunca projede çalıştığımı varsayarsam, o zaman bu sayıya baktığımda, 5 gün ve 1 saat boyunca projede çalıştığımı göreceğim. Bir şekilde tutarsız ... – Maris

cevap

0

Bu birkaç gün içinde Avrupa'da olur zaman değişikliğini tasarrufu Gün Işığı kaynaklanır. Bunun, aralık biçimlendiricinin beklenen davranışı olup olmadığından emin değilim (kesinlikle biraz garip görünüyor). Ancak, tüm saat dilimi sorunları gibi, saat dilimini belirli bir GMT saat dilimine ayarlayarak bunu düzeltebilirsiniz. Bu durumda, GMT-00:00, muhtemelen beklenen zaman dilimidir:

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

Harika, teşekkürler, @Sulthan - Bu gerçekten yardımcı oldu! – Maris

+0

Dikkat edin, bu hala sorunları yıllarca kaldıracak ve saniyeler geçmeyecek, yalnızca DST'yi engelleyecektir. Bu yüzden yılın geçerli gününe ve zaman aralığınızın uzunluğuna bağlı olarak, hala yanlış sonuçlar alabilirsiniz. –