Получайте каждый круглый час из Firestore

# #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 часа.