2016-03-24 2 views
0

Я нашел довольно странное поведение NSDateComponentsFormatter - на некоторые промежутки времени он просто добавляет дополнительный час к результату.NSDateComponentsFormatter добавляет дополнительный час

Я предполагаю, что для временных интервалов более 1 года он может добавить «скачок високосного хода», но в этом случае я вижу, что промежуток времени, равный 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 час?

Спасибо!

Maris

+0

Добро пожаловать в летнее время ... Это март, и вы, вероятно, в Европе. Это означает, что вы в течение 3-4 дней сменили переход на летнее время. – Sulthan

+0

ОК, я могу это понять, но летнее время относительно текущей даты. Однако интервал времени не должен быть привязан к текущей дате. В противном случае, если я предполагаю, что я работал над проектом 5 дней, то в определенный момент времени, когда я посмотрю на это число, я увижу, что я работал над проектом 5 дней и 1 час. Как-то непоследовательно ... – Maris

ответ

0

Это вызвано Daylight зимнего времени, которое происходит в Европе в течение нескольких дней. Я не уверен, является ли это ожидаемым поведением интервального форматирования (это определенно кажется немного странным). Однако, как и все проблемы с часовым поясом, вы можете исправить это, установив часовой пояс в определенный часовой пояс 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

Будьте осторожны, это все еще не решает проблемы с високосными годами и прыжками секунд, это только позволяет избежать летнего времени. Поэтому, в зависимости от текущего дня года и продолжительности вашего временного интервала, вы все равно можете получить неправильные результаты. –

Смежные вопросы