секунды теряются при передаче даты и времени из flutter в firebase firestore

#firebase #flutter #google-cloud-firestore

# #firebase #flutter #google-облако-firestore

Вопрос:

Я сохраняю документы в firestore, используя datetime в качестве их идентификатора, но если я сохранил более одного за одну минуту, он удаляет старый и заменяет его новым «в ту же минуту». Я проверяю дату и время в flutter, у него есть секунды и миллисекунды, но в firestore это всего лишь минуты и секунды а миллисекунды устанавливаются равными 00:000

значение 2020-12-04 13:51:03.836035 в flutter превращается в 2020-12-04 13:51:00.000 в firestore

как я могу решить эту проблему?

Я использую

 users
    .doc(auth.currentUser.uid)
    .collection('documents')
    .doc(dateTime.toString())
    .set({
      'day': DateTime.parse(dateTime.toString().substring(0, 10)),
      'document': {
        dateTime.toString(): {'documentContent': content.text, 'documentDateTime': dateTime}
      }
    }, SetOptions(merge: true))
    .then((value) => print("Document Added"))
    .catchError((error) => print("Failed to add Document: $error"));
 

DateTime — это объект DateTime, кстати

Я говорю об этой части «documentDateTime»: DateTime или DateTime.toString()

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

1. Похоже, что ваш .substring(0, 10) урезает время от даты? Если вы удалите это, это что-нибудь изменит?

2. Я вижу это, но я говорю об этой части «documentDateTime»: DateTime или DateTime.toString()

3. Ах, моя ошибка. Итак, что происходит, когда вы отлаживаете и получаете значение document ( dateTime.toString() )

Ответ №1:

Я использовал код, которым вы поделились, для создания документа, а затем загрузил документы обратно в приложение Flutter и распечатал его содержимое, и вот что я получаю:

 // Add code right below your snippet
users
    .doc(auth.currentUser.uid)
    .collection('documents')
    .doc(dateTime.toString())
    .get()
    .then((doc) => print(doc.data()));

// Output:
{document:
  {2020-12-18 13:49:58.496955: 
    {documentContent: xx,
     documentDateTime: Timestamp(seconds=1608299398, nanoseconds=496000000)}},
 day: Timestamp(seconds=1608249600, nanoseconds=0)}
 

Действительно, в поле documentDateTime есть данные за миллисекунды. Происходит то, что пользовательский интерфейс консоли Firestore не отображает данные за миллисекунды, даже если данные есть.

введите описание изображения здесь

Ответ №2:

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

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

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

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

1. спасибо за совет, но у меня уже есть поле в документе для объекта DateTime, но секунды не регистрируются только 00:000, как я могу это решить?

2. Вы удалили их с помощью substring(0,10). Если вы этого не хотите, то удалите этот код. Вам нужно будет точно определить, что вы хотите сохранить, а затем убедиться, что ваш код соответствует этому. Если вам нужна помощь в этом здесь, вам следует отредактировать вопрос, чтобы более подробно объяснить, что работает не так, как вы ожидаете, показывая конкретные примеры.