web-dev-qa-db-fra.com

Enregistrement et récupération de la date dans Firebase

J'ai un modèle avec la structure suivante 

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

Tout le reste fonctionne bien pour économiser. Il enregistre dans la base de données Firebase Realtime sous

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

Mais quand j'essaye de le récupérer, la date donne l'erreur suivante - 

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$1.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$1.run(Unknown Source)
at Android.os.Handler.handleCallback(Handler.Java:615)

Je comprends que Firebase ne prend pas en charge l’objet Java Date, mais comme il est enregistré dans une carte, comment puis-je récupérer la date à partir de cette carte? Existe-t-il un moyen approprié de sauvegarder et de récupérer les dates dans Firebase Android?

11
noob

Vous pouvez stocker la date en tant que date d'époque. C’est long que vous puissiez utiliser votre heure système System.currentTimeMillis(); ou en utilisant l’heure du serveur Firebase avec leur ServerValue.TIMESTAMP. La première option est qu’elle change en fonction des fuseaux horaires et des paramètres système. Ainsi, si vous stockez la date de manière longue, il vous suffit de changer votre OfferModel champ mStartDate en long et d'utiliser ensuite new Date(long) pour obtenir la Date correspondante lors de l'extraction de l'objet.

15
Sunshinator

Utiliser Format de date ISO 8601:

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

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

Représenter Date en tant que String présente deux avantages plus importants:

  • Il est lisible par l'homme ("2018-03-30T13:18:39.516Z" vs 1522415925281)
  • Du côté du navigateur, vous pouvez simplement appeler new Date("2018-03-30T13:18:39.516Z") 

Ceci est très utile si Android et les navigateurs utilisent les données Firebase. 

4
JP Ventura

Voici comment j'ai réussi à stocker Date sur Firebase en utilisant SimpleDateFormat pour la convertir en une date sans secondes, heures ni millisecondes. 

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);
}

et voici comment il apparaît sur Firebase:

 Date onFirebase

J'espère que ça aide..

4
Zack

Bien que firebase prenne en charge le type de données Format de date, je préférerais enregistrer la date et l’heure au format chaîne, car il est très facile de les récupérer en les stockant sous forme de chaîne.

Pour stocker la date-heure actuelle du système dans un format de chaîne juste en dessous du code, cela suffira.

        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);   

Maintenant, on peut utiliser strDate pour stocker dans la base de feu ou faire ce que l'on veut faire avec cette chaîne.

2
Nabajyoti Das

vous pouvez définir un objet de date sur Firebase

yourReference.setValue(new Date());

Ça marche, mais

J'ai remarqué d'autres problèmes avec la date, lorsque j'ai changé le mois manuellement à partir de la base de données, lors de l'extraction, la valeur reste inchangée

0
yading