关于java:在Firebase中保存和检索日期

Saving and retrieving date in Firebase

我有一个具有以下结构的模型

1
2
3
4
5
6
7
8
9
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实时数据库中保存为

1
2
3
4
5
6
7
8
9
10
startDate
    date: 22
    day: 3
    hours: 23
    minutes: 20
    month: 5
    seconds: 50
    time: 1466617850476
    timezoneOffset: -330
    year: 116

但是当我试图检索它时,日期给出了以下错误-

1
2
3
4
5
6
7
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)

我知道FielBASE不支持JavaDebug对象,但是既然它在地图中保存了,那么我怎么才能从那个地图中取回日期呢?在FireBase Android中是否有保存和检索日期的适当方法?


可以将日期存储为纪元日期。使用系统时间System.currentTimeMillis();或将firebase服务器时间与ServerValue.TIMESTAMP一起使用很长时间。第一个选项的作用是它会随着时区和系统设置而改变。因此,如果您将日期存储得很长,那么在检索对象时,只需将您的OfferModel字段mStartDate更改为long,然后使用new Date(long)获取相应的Date


使用ISO 8601日期格式:

1
2
3
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"1522415925281)
  • 在浏览器端,您可以简单地调用new Date("2018-03-30T13:18:39.516Z")

如果您的Android和浏览器都使用FireBase数据,那么这非常有用。


这就是我如何使用simpledateformat将日期转换为不带秒、小时或毫秒的日期,从而在FireBase上存储日期的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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支持日期格式数据类型,但我还是希望以字符串格式保存日期时间,因为将其存储为字符串会变得非常容易检索。

要以字符串格式存储当前系统日期时间,只需在代码下面。

1
2
3
4
        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中,也可以对该字符串执行任何操作。


可以在FireBase上设置日期对象

1
yourReference.setValue(new Date());

它起作用,但是

我注意到了日期的其他问题,当我从数据库手动更改月份时,当检索该日期时,值保持不变。