2015-05-14 2 views
1

Я могу получить дату в подборщике даты, рассчитать время, оставшееся время и положить в ярлык. Это дает секунд:Быстрое времяИнтервальное форматирование

let timeLeft = datePicker.dateValue.timeIntervalSinceNow 
countingLabel.stringValue = "seconds left: \(timeLeft)" 

Как форматировать "TimeLeft"?

I tried this and it does not work: 
var formatter = NSDateFormatter() 
formatter.dateFormat = "EEEE, yyyy-MM-dd hh:mm:ss" 
let timeLeft2 = formatter.stringFromDate(timeLeft) 
+0

'timeIntervalSinceNow' не является' экземпляр NSDate' но примитивный 'NSTimeInterval', поэтому вы не можете использовать его непосредственно с' NSDateFormatter', сначала нужно преобразовать его обратно в 'NSDate', если вы» d хотел бы отформатировать его как дату. _ (это тысячный хороший пример, почему тип не должен быть когда-либо обойденным при создании 'var' или' let') ._ – holex

ответ

2

Вы можете использовать NSDateComponentsFormatter. Из документации:

NSDateComponentsFormatter объекта принимает количество времени и форматирует их в качестве пользовательских считываемых строк. Используйте компоненты даты formatter для создания строк для интерфейса вашего приложения.

Пример:

let formatter = NSDateComponentsFormatter() 
formatter.unitsStyle = .Full 
formatter.allowedUnits = .CalendarUnitSecond | .CalendarUnitMinute | .CalendarUnitHour 

let pickedDate = datePicker.dateValue 
let now = NSDate() 
let formattedTimeLeft = formatter.stringFromDate(now, toDate: pickedDate)! 

// Example result : 1:06:50 

Есть еще несколько выходных форматов доступны, например,

.Abbreviated : 1h 6m 50s 
.Short :  1 hr, 6 min, 50 secs 
.Full :   1 hour, 6 minutes and 50 seconds 
+0

Это дает мне: Необязательно (20 часов, 56 минут, 8 секунд) Почему Необязательный и родительский процесс и как избавиться от него? – Nrc

+0

@Nrc: 'stringFromDate()' возвращает строку * optional *, поэтому вам нужно развернуть его с помощью '!'. Я обновил код. –

+0

Он работает очень хорошо, спасибо. Вы знаете, как сделать что-то, если оставшееся время дойдет до 0 ?. Что-то вроде: if formattedTimeLeft == 0 {} – Nrc

0

Чтобы получить TimeLeft вы должны использовать два компонента времени и получить их следующим Всё различие:

let todayComponents = NSCalendar.currentCalendar().components(.DayCalendarUnit | .MonthCalendarUnit | .YearCalendarUnit | .CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond | , fromDate : NSDate()) 

var pickedDateComponents = NSCalendar.currentCalendar().components(.DayCalendarUnit | .MonthCalendarUnit | .YearCalendarUnit | .CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond | , fromDate : datePicker.dateValue) 

pickedDateComponents.second = pickedDateComponents.second - todayComponents.second 
pickedDateComponents.minute = pickedDateComponents.minute - todayComponents.minute 
pickedDateComponents.hour = pickedDateComponents.hour - todayComponents.hour 
pickedDateComponents.day =pickedDateComponents.day - todayComponents.day 
pickedDateComponents.month = pickedDateComponents.month - todayComponents.month 
pickedDateComponents.year = pickedDateComponents.year - todayComponents.year 

let timeLeft = NSCalendar.currentCalendar().dateFromComponents(pickedDateComponents)! 
+0

это дает мне тот же результат, что: let myDate = datePicker.dateValue Это время выбора даты, которую я могу отформатировать позже без проблем. Проблема, с которой я сталкиваюсь, - это позволить timeLeft, то есть разницу между временем и временем, выбранным в дневнике. – Nrc

+0

@Nrc проверить отредактированный ответ –

+0

Я думаю, что это не сработает. Может, я что-то упустил? – Nrc