Как сохранить интервал времени с помощью HH:ММ:СС:МС?

#swift #time #formatter

Вопрос:

Так что это оказалось намного сложнее, чем я ожидал. У меня есть четыре текстовых поля, которые позволяют пользователю вводить HH:MM:SS:MS, и мне нужно смешать их вместе, чтобы создать число, которое я могу сохранить в fireStore.

Затем мне нужно вывести это число и снова преобразовать его в HH:MM:SS:MS для использования в таблицах, графиках и т. Д.

Я изначально рассматривал возможность использования строки, но это не поможет мне с графиками/упорядочением, которые я хочу сделать позже. Провел много поисков и не смог найти работоспособное решение, включающее миллисекунды.

Любая помощь будет признательна!

Немного кода ниже, если это поможет, все, что у меня есть на данный момент, — это то, что я объединяю их в строку…

 let goalHHText = UITextField()
let goalMMText = UITextField()
let goalSSText = UITextField()
let goalMSText = UITextField()

let goalCombined.append(goalHHText.text!   ":"   goalMMText.text!   ":"   goalSSText.text!   ":"   goalMSText.text!)
 

Затем я добавляю goalCombined в словарь и толкаю в Firestore. Извините, что это все, что у меня есть, я на 100% кодирую нуб.

Я посмотрел на dateComponentsFormatter, но он не поддерживает миллисекунды

 let interval = 27005
let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute, .second ]
formatter.unitsStyle = .full
let formattedString = formatter.string(from: TimeInterval(interval))!
print(formattedString)
 

Комментарии:

1. Вам следует изучить компоненты данных и/или форматирование компонентов данных

2. Я посмотрел на дату компоненты @JoakimDanielson но он не поддерживает миллисекунды, я построил для преобразования секунд, но мне нужно миллисекунд code пусть форматирования = DateComponentsFormatter() Formatter для.allowedUnits = [.час .минуту .второй ] форматирования.unitsStyle = .полный профиль Let formattedString = форматирования.строки(из: TimeInterval(интервал))! печать(форматированная строка)

Ответ №1:

Преобразуйте его в наименьшую единицу времени, здесь миллисекунды. Преобразуйте все время в миллисекунды с помощью :-

 index = (((HH*60   MM)*60   SS)*60   MS)*1000;
 

Храните значение «индекс» в firestore как тип «число». Также храните отдельные значения HH, MM, SS, MS отдельно в firestore для удобства поиска.

Комментарии:

1. Спасибо @HarisWilson итак, есть ли способ преобразовать это обратно в HH MM SS MS? Я рассматривал аналогичное решение с использованием форматирования даты, но оно не поддерживает миллисекунды… code пусть интервал = 27005 пусть форматирование = DateComponentsFormatter() форматирование.Разрешенные единицы = [.час, минута, секунда ] форматирование.unitsStyle = .full пусть форматированная строка = форматирование.строка(от: timeInterval(интервал))! печать(форматированная строка)

2. Кроме того, если вы храните время точно в этом строковом формате «ЧЧ:ММ:СС:МС», не возникнет никаких проблем с заказом в firestore. Вы получите ожидаемые результаты при заказе, даже если они указаны в строках. Но все отдельные поля в записях должны содержать одинаковые цифры, т. е. Если вы используете две цифры для хранения одного часа, вы должны использовать 01:00:00:000 вместо 1:0:0:0 , а также ваш диапазон будет ограничен максимум 99:99:99:999 до 00:00:00:000

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

4. Почему вы хотите преобразовать его обратно из самого разбитого значения? Когда вы сохраняете разбитое значение в базе данных, также сохраняйте отдельные значения, чтобы вы могли извлекать эти значения также всякий раз, когда вы извлекаете разбитое значение, все просто

5. Я просто предположил, что пытаюсь создать какой-то формат даты, который будет распознаваться swift. По моему мнению, это должно было позволить мне легче манипулировать данными (упорядочивать, отображать на графике — в зависимости от того, какую библиотеку я выберу)