# #flutter #google-cloud-firestore
Вопрос:
У меня есть данные, хранящиеся в Firestore, данные добавляются в Firestore каждую секунду, поэтому за 24 часа у меня есть 1440 документов (24 * 60), я хочу получить только круглый час из Firestore, чтобы показать его на графике, как я могу получить только круглый час из Firestore?
Комментарии:
1. Вы пытаетесь получить данные отдельно за каждый полный час, например, получить данные о времени между 1:00 вечера и 2:00 вечера? И он должен вернуть вам эти 60 записей за этот час?
2. Нет.. я пытаюсь получить только дату 1:00 вечера и 2:00 вечера (3:00 вечера и т. Д.).
Ответ №1:
Прежде всего, вам нужно будет сохранить документы firestore со свойством метки времени, а затем запросить документы со значением метки времени, которое дает округленный час, используя API-интерфейсы DateTime и DateFormat flutter.
Как только вы получите метку времени из Firestore, что-то вроде : Метка времени(секунды=1560523991, наносекунды=286000000)
Вы можете получить только округленный час из значения метки времени, используя 2 способа :
Вам нужно разобрать его на объект типа DateTime:
DateTime myDateTime = (snapshot.data.documents[index].data['timestamp']).toDate(); // prints 2020-05-09 15:27:04.074
Это вернет вашу метку времени Firestore в формате даты и времени dart. Для преобразования объекта DateTime вы можете использовать класс DateFormat из пакета intl. Вы можете использовать полученный объект DateTime для получения выбранного вами формата следующим образом:
Возможное решение 1 :
DateFormat.Hm().format(myDateTime); //prints 15.27
Таким образом, запрос должен искать документы с:
DateFormat.m().format(myDateTime) to be “00”
как
DateFormat.m() returns minutes and if minutes == 00 then the timestamp is rounded to the nearest hour.
Возможное решение 2 :
Преобразуйте метку времени в строку времени с помощью :
Let TimeString = snapshot.data.documents[index].data['timestamp']).toDate().toString() // prints ‘2019-12-28 18:48:48.364’
Let time = TimeString.split(“ “)[1] // prints 18:48:48.364
To check if the minutes is “00” :
if time.substring(3,5) == “00”, then it's a rounded hour. //here it is 48
Вам нужно будет ввести эти логики преобразования меток времени, а затем запросить, как я уже упоминал, для округленной часовой метки времени. Нет готовых доступных функций/методов для получения документов firestore с округленными часами.
Комментарии:
1. Мой вопрос касался только получения данных о метках времени из firebase каждые круглые часы, и ваш ответ на это не отвечает..
2. Объект метки времени в firebase представлен в секундах и долях секунд с разрешением в наносекунду по времени UTC. Вам придется использовать методы DateFormat/ToDate()/toString()/методы DateTime, чтобы преобразовать его в формат даты и времени. Я не думаю, что у нас есть встроенный метод округления часов непосредственно из метки времени firebase. Поэтому я предложил альтернативное решение, чтобы дать вам представление о том, как вы можете выполнять преобразования. Попробуйте реализовать это и возвращайтесь с вопросами, если таковые имеются.
Ответ №2:
Firestore поддерживает запросы «В».
Сохраните как отметку времени и попробуйте выполнить следующие действия
const roundhour1 = new Date('2021-10-01T01:00:00.000z');
const roundhour2 = new Date('2021-10-01T02:00:00.000z');
А затем напишите запрос, как показано ниже:
database.collection("collectionName").where("fieldName", "in", ["roundhour1", "roundhour2"]);
У вас может быть до 10 значений (roundhourX) для проверки «ВХОДА», поэтому необходимо выполнить 3 запроса, чтобы получить все данные за 24 часа.