Как сохранить flutter TimeOfDay в firebase?

#firebase #flutter #dart #google-cloud-firestore #dart-pub

#огневая база #flutter #дротик #google-облако-firestore #dart-pub

Вопрос:

Я работаю над приложением flutter, в котором я показываю TimeRangepicker с помощью этого плагина: time_range_picker, и в результате я получаю TimeOfDay (09:00) TimeOfDay (12:00), используя этот код:

   onPressed: () async {
                        TimeRange result = await showTimeRangePicker(
                            use24HourFormat: false,
                            interval: Duration(minutes: 30),
                            context: context,
                            start: TimeOfDay(hour: 9, minute: 0),
                            end: TimeOfDay(hour: 12, minute: 0),
                            disabledTime: TimeRange(
                                startTime: TimeOfDay(hour: 23, minute: 0),
                                endTime: TimeOfDay(hour: 5, minute: 0)),
                            disabledColor: Colors.red.withOpacity(0.5),
                            strokeWidth: 4,
                            ticks: 24,
                            ticksOffset: -7,
                            ticksLength: 15,
                            ticksColor: Colors.grey,
                            labels: [
                              "12 pm",
                              "3 am",
                              "6 am",
                              "9 am",
                              "12 am",
                              "3 pm",
                              "6 pm",
                              "9 pm"
                            ].asMap().entries.map((e) {
                              return ClockLabel.fromIndex(
                                  idx: e.key, length: 8, text: e.value);
                            }).toList(),
                            labelOffset: 35,
                            rotateLabels: false,
                            padding: 60);

                        print("${result.startTime}   ${result.endTime}");
                      },
 

Но единственная проблема в том, что я могу найти подходящий способ сохранить это в firebase, мне не нужна дата, все, что мне нужно, это TimeOfDay.

Ответ №1:

В Firestore нет определенного типа данных для хранения времени суток, поэтому вам придется сопоставить его с одним из существующих типов.

Некоторые общие сопоставления:

  • Сохраните время суток в виде строкового значения, например, «07:55:00.000» (если вас интересует точность до миллисекунды)
  • Сохраните время суток как смещение от полуночи, например, 28500 (как количество секунд с полуночи до 7:55 утра)
  • Сохраняйте время суток как часть времени фиксированного дня в Timestamp поле. По сути, это вариант предыдущего подхода, со смещением от начала эпохи. Допустим, вы выбираете начало эпохи (1 января 1970 года) в качестве фиксированного дня, тогда значение метки времени будет равно 28500000 (в миллисекундах).

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

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

1. Большое спасибо, Фрэнк, за ваш ценный ответ, я решил пойти на 3-е предложение в вашем приложении, я преобразовал TimeOfDay в метку времени на фиксированную дату и сохранил в firestore в качестве значения метки времени, затем я перенес метку времени из firestore и преобразовал ее обратно в TimeOfDay. Еще раз спасибо 🙂

Ответ №2:

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

 Map timeOfDayToFirebase(TimeOfDay timeOfDay){
    return {
        'hour':timeOfDay.hour,
        'minute':timeOfDay.minute
           }
}


TimeOfDay firebaseToTimeOfDay(Map data){
        return TimeOfDay(
            hour: data['hour'],
            minute: data['minute']);
}



var myTimeOfDayObject=TimeOfDay.now();
firebase.update({'time': timeOfDayToFirebase(myTimeOfDayObject)});
 

Таким образом, вам не нужно беспокоиться об управлении смещениями, непреднамеренных изменениях локали и так далее.