Сохранение и извлечение даты в Firebase

у меня есть модель со следующей структурой

public class OfferModel {
    private String mImageUrl;
    private String mOfferCode;
    private String mOfferTitle;
    private String mOfferDescription;
    private boolean mIsRunning;
    private String mCreatorUid;
    private Date mStartDate;
}

все остальное отлично работает при сохранении. Он сохраняет в базе данных Firebase в реальном времени как

startDate
    date: 22
    day: 3
    hours: 23
    minutes: 20
    month: 5
    seconds: 50
    time: 1466617850476
    timezoneOffset: -330
    year: 116

но когда я пытаюсь получить его, дата дает следующую ошибку -

java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.Date
at com.localvine.models.OfferModel.<init>(OfferModel.java:37)
at com.localvine.managers.OfferManager.onDataChange(OfferManager.java:62)
at com.google.android.gms.internal.zzafp.zza(Unknown Source)
at com.google.android.gms.internal.zzagp.zzSu(Unknown Source)
at com.google.android.gms.internal.zzags.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:615)

Я понимаю, что Firebase не поддерживает объект Java Date, но поскольку он сохраняет их на карте, как я могу вернуть дату с этой карты? Есть ли правильный способ сохранения и извлечения дат в Firebase Андроид?

5 ответов


вы можете сохранить дату как дату эпохи. Это долго, что вы можете получить, используя свое системное время System.currentTimeMillis(); или используя серверное время Firebase с их ServerValue.TIMESTAMP. Дело с первым вариантом заключается в том, что он изменяется с часовыми поясами и системными настройками. Поэтому, если вы храните дату как длинную, вам просто нужно изменить свой OfferModel поле mStartDate до long и затем использовать new Date(long) чтобы получить соответствующий Date при извлечении объекта.


вот как мне удалось сохранить дату на Firebase, используя SimpleDateFormat, чтобы преобразовать ее только в дату без секунд, часов или миллисекунд.

public void storeDatetoFirebase() {

    handler = new Handler();

    runnable = new Runnable() {
        @Override
        public void run() {
            handler.postDelayed(this, 1000);
            try {
                Date date = new Date();
                Date newDate = new Date(date.getTime() + (604800000L * 2) + (24 * 60 * 60));
                SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
                String stringdate = dt.format(newDate);

                System.out.println("Submission Date: " + stringdate);
                DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("My_Date");
                databaseReference.child("init_date").setValue(stringdate);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    handler.postDelayed(runnable, 1 * 1000);
}

и вот как это выглядит на Firebase:

Date onFirebase

надеюсь, что это помогает..


хотя firebase поддерживает тип данных формата даты, я бы предпочел сохранить дату-время в строковом формате, потому что, сохраняя его как строку, его становится довольно легко получить.

для хранения текущей системной даты-времени в строковом формате чуть ниже кода.

        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date date = new Date();
        String strDate = dateFormat.format(date).toString();
        myRef.child("datetime").setValue(strDate);   

теперь можно использовать strDate для хранения в firebase или делать все, что вы хотите сделать с этой строкой.


использовать ISO 8601 формат даты:

SimpleDateFormat ISO_8601_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:sss'Z'");

String now = ISO_8601_FORMAT.format(new Date());

представляют Date как String имеет два больших преимущества:

  • это человек читаемый ("2018-03-30T13:18:39.516Z" vs 1522415925281)
  • на стороне браузера, вы можете просто вызывает new Date("2018-03-30T13:18:39.516Z")

это очень полезно, если у вас есть Android и браузеры, потребляющие данные Firebase.


вы можете установить объект даты на Firebase

yourReference.setValue(new Date());

это работает, но

Я заметил другую проблему с датой, когда я изменил месяц вручную из БД, при его извлечении значение остается, как и раньше