Как мне сохранить DateTime из Flutter DateTimePicker и записать в Firebase в качестве метки времени

#firebase #flutter #timestamp

#firebase #flutter #временная метка

Вопрос:

Я использую DatePicker, как показано ниже, чтобы позволить пользователю устанавливать дату. Я хочу сохранить эту выбранную дату и время в Firebase в качестве метки времени. Как мне это сделать?

Спасибо.

 showDatePicker(
          context: context,
          initialDate: widget.isUpdating
              ? _currentExpense.createdAt.toDate()
              : _dateTime, //_currentExpense.createdAt == null,
          firstDate: DateTime(2001),
          lastDate: DateTime.now())
      .then((date) {
    _dateTime = date;
    setState(() {
      dateTimeText = _getDateString(date);
    });
  });
  

Ответ №1:

Вы можете использовать dateTimeObject.millisecondsSinceEpoch для преобразования его в an int и сохранения в своей базе данных.

А затем использовать DateTime.fromMillisecondsSinceEpoch(msIntFromServer) для преобразования его обратно в объект DateTime.

Или, если вы хотите еще большей точности, вы можете сделать это за микросекунды.

https://api.flutter.dev/flutter/dart-core/DateTime-class.html

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

1. Спасибо! Итак, чтобы уточнить, временная метка в основном сохраняется как / в миллисекундах или микросекундах?

2. Кроме того, использование вашего предложения означает, что я должен сохранить _currentExpense.createdAt как int в моей БД, а не как временную метку? В моем setState() я сделал _currentExpense.createdAt = _dateTime.millisecondsSinceEpoch в качестве временной метки; но он не был успешно сохранен в DB, поскольку ожидал временную метку, и я отправляю int в качестве значения.

3. @hermie_brown Я просто говорю, что вы могли бы сохранить его как int. Если вы уже используете указанный формат для временной метки в своей базе данных, вам следует ознакомиться с документами firebase или библиотекой, которую вы используете, о том, как отформатировать временную метку в этот формат.

Ответ №2:

Я понял это. Я видел сообщение в этих группах Google, оно хорошо соответствовало более раннему предложению Er1.

Для тех, кто ищет, вот хак:

   Timestamp _dateTimeToTimestamp(DateTime dateTime) {
    return Timestamp.fromMillisecondsSinceEpoch(
        dateTime.millisecondsSinceEpoch);
  }

onTap: () {
  showDatePicker(
          context: context,
          initialDate: widget.isUpdating
              ? _currentExpense.updatedAt.toDate()
              : DateTime.now(),
          firstDate: DateTime(2001),
          lastDate: DateTime.now())
      .then((date) {
    _dateTime = date;
    print(_dateTime);

    setState(() {
      dateTimeText = _dateTimeToString(_dateTime);

      if (widget.isUpdating) {
        _currentExpense.updatedAt = _dateTimeToTimestamp(_dateTime);
      } else {
//this is new entry
        _currentExpense.createdAt = _dateTimeToTimestamp(_dateTime);
        _currentExpense.updatedAt = _dateTimeToTimestamp(_dateTime);
        }
     });
   });