Как лучше конвертировать время в двойное и обратно, сохраняя время в Swift - PullRequest
0 голосов
/ 11 декабря 2018

В моем быстром приложении я использую время, которое хочу рандомизировать между определенным интервалом.У меня есть интервал начала и конца интервала.В результате я конвертирую определенное время (например, 14:34) в двойное, так что я могу использовать Double.random(in: startInterval ... endInterval), чтобы получить случайное время в интервале.Затем я превращаюсь обратно в int версию времени.Как лучший способ сделать это?В настоящее время у меня есть это, но это не работает совсем правильно:

public static func convertToTimeDouble(hour: Int, minute: Int) -> Double {

    return Double(hour) + (Double(minute) / 60.0)

}

public static func extractHourFromTimeDouble(alarmTimeDouble: Double) -> Int {

    return Int(floor(alarmTimeDouble))

}

public static func extractMinuteFromTimeDouble(alarmTimeDouble: Double) -> Int {

    return Int(floor((alarmTimeDouble - floor(alarmTimeDouble)) * 60)

}

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Вы идете по этому очень сложному пути.

Date объекты могут быть очень легко преобразованы в числа с плавающей запятой, используя метод timeIntervalSinceReferenceDate.Это дает вам количество секунд с произвольной «даты эпохи».Затем вы можете выполнить математику для этих временных интервалов, чтобы вычислить разницу в секундах.

Делая математику в часах, минутах и ​​секундах, вам лучше использовать Calendar объект и методы, которые имеют дело с DateComponents.Существуют целые группы методов, которые позволяют извлекать год, месяц, день, часы, минуты, секунды и т. Д. Из дат, используя текущий календарь и часовой пояс.

Вы должны научиться использовать системные методы.Они делают всю тяжелую работу за вас, с кодом, который хорошо протестирован и обрабатывает все различные странные случаи, такие как переход на летнее время, високосные годы и т. Д.

0 голосов
/ 11 декабря 2018

Я понял это.Все, что мне нужно было сделать, это поменять местами раунды в минутной функции, а не в часовой.Финальная версия такова:

public static func convertToTimeDouble(hour: Int, minute: Int) -> Double {

    return Double(hour) + (Double(minute) / 60.0)

}

public static func extractHourFromTimeDouble(alarmTimeDouble: Double) -> Int {

    return Int(floor(alarmTimeDouble))

}

public static func extractMinuteFromTimeDouble(alarmTimeDouble: Double) -> Int {

    return Int(round((alarmTimeDouble - floor(alarmTimeDouble)) * 60))

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...