#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. По моему мнению, это должно было позволить мне легче манипулировать данными (упорядочивать, отображать на графике — в зависимости от того, какую библиотеку я выберу)