web-dev-qa-db-ja.com

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 Realtimeデータベースに次の形式で保存します

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

FirebaseはJava Dateオブジェクトをサポートしていませんが、マップに保存しているので、そのマップから日付を取得するにはどうすればよいですか?保存および取得する適切な方法はありますか? Firebase Androidの日付

12
noob

日付をエポック日付として保存できます。システム時間System.currentTimeMillis();を使用するか、Firebaseサーバー時間と_ServerValue.TIMESTAMP_を使用して取得できるのは長いことです。最初のオプションの利点は、タイムゾーンとシステム設定によって変わることです。したがって、日付をlongとして保存する場合は、OfferModelフィールドmStartDatelongに変更し、new Date(long)を使用してオブジェクトを取得するときに対応するDate

15
Sunshinator

ISO 8601日付形式を使用:

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

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

DateStringとして表すことには、2つの大きな利点があります。

  • 人間が読める(_"2018-03-30T13:18:39.516Z"_ vs _1522415925281_)
  • ブラウザ側では、単にnew Date("2018-03-30T13:18:39.516Z")を呼び出すことができます

これは、Androidがあり、ブラウザが両方ともFirebaseデータを使用している場合に非常に便利です。

6
JP Ventura

これは、SimpleDateFormatを使用して、秒、時間、またはミリ秒のない日付のみに変換することにより、Firebaseに日付を保存する方法です。

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

それが役に立てば幸い..

4
Zack

FirebaseはDate形式のデータ型をサポートしていますが、文字列として保存することで取得が非常に簡単になるため、文字列形式で日時を保存することをお勧めします。

現在のシステムの日付と時刻をコードのすぐ下の文字列形式で保存するには、次のようにします。

        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に保存したり、その文字列を使用してやりたいことができます。

2
Nabajyoti Das

firebaseで日付オブジェクトを設定できます

yourReference.setValue(new Date());

動作しますが、

私はdbから月を手動で変更したときに日付に関する他の問題に気づきましたが、それを取得すると値は以前のままになります

0
yading