Android:从firebase获取当前日期和时间

Posted

技术标签:

【中文标题】Android:从firebase获取当前日期和时间【英文标题】:Android : Get current date and time from firebase 【发布时间】:2018-09-26 15:34:41 【问题描述】:

我正在开发一个简单的游戏,用户可以获得每日奖励。我想从 firebase 服务器获取当前日期和时间,因为我不想依赖可以操纵的设备时间。我通过了 ServerValue。 firebase 中的 TIMESTAMP 但不知道如何使用它。它返回一个值作为时间戳的地图。我如何将该时间戳转换为日期。当用户点击每日奖金时,我想从 firebase 获取今天的日期。

【问题讨论】:

【参考方案1】:

自从 Firebase 推出 Callable Functions 以来,您可以通过在 Firebase Cloud Functions 中创建一个可调用函数来轻松地在您的应用中使用它。 在您的index.js 中,创建一个函数并使其返回当前时间戳

exports.getTime = functions.https.onCall((data,context)=>
return Date.now()
)

然后将其部署到 Firebase Cloud Functions

然后在您的 android 应用中添加 Callable Functions 依赖项

implementation 'com.google.firebase:firebase-functions:16.1.0'

然后像这样从您的应用中调用该函数,并确保您键入的函数名称与您的云函数中的“getTime”相同

    FirebaseFunctions.getInstance().getHttpsCallable("getTime")
            .call().addOnSuccessListener(new OnSuccessListener<HttpsCallableResult>() 
        @Override
        public void onSuccess(HttpsCallableResult httpsCallableResult) 
            long timestamp = (long) httpsCallableResult.getData();

        
    );

如果你想在多个类中调用这个方法,你也可以做一个简单的接口

public interface OnGetServerTime 
    void onSuccess(long timestamp);

    void onFailed();


 public void getServerTime(final OnGetServerTime onComplete) 
    FirebaseFunctions.getInstance().getHttpsCallable("getTime")
            .call()
            .addOnCompleteListener(new OnCompleteListener<HttpsCallableResult>() 
                @Override
                public void onComplete(@NonNull Task<HttpsCallableResult> task) 
                    if (task.isSuccessful()) 
                        long timestamp = (long) task.getResult().getData();
                        if (onComplete != null) 
                            onComplete.onSuccess(timestamp);
                        
                     else 
                        onComplete.onFailed();
                    
                
            );


【讨论】:

这太棒了!谢谢。 这是个好主意,但我想知道返回日期/时间的时区【参考方案2】:

ServerValue.TIMESTAMP 只是一个令牌,当它在写入操作期间用作子值时,Firebase 实时数据库将其转换为服务器上的数字。日期仅在写入完成后出现在数据库中。

如果你想要那个值,你可以在你写它的位置从数据库中读回它。但是您应该明白,这需要与数据库进行两次往返,首先是写入,然后再次读取。当您取回该值时,它将不再是当前时刻的完美表示,因为它代表了最初写入该值的时刻。

【讨论】:

这意味着我不能使用 firebase 时间戳来每天获取当前日期和时间来提供每日奖励...... 它将关闭几秒钟。如果您想通过 REST api 执行此操作,请发布 ".sv":"timestamp" 这是您所说的令牌的等效 json 版本:) @Doug,那么有没有什么方法可以在没有读写方法的情况下使用 firebase 获取日期和时间?这里是my question,可以帮忙吗?【参考方案3】:

您可以使用 java.util.Date 将时间戳转换为日期和时间。 例如

Date date = new Date(timestamp.getTime());

【讨论】:

ServerValue.TIMESTAMP 的实际值不是这样工作的。 你检查过 ServerValue.TIMESTAMP 的数据类型是什么。 ServerValue.TIMESTAMP 需要转换成long ServerValue.TIMESTAMP 是一个地图。它没有 getTime() 方法。 firebase.google.com/docs/reference/android/com/google/firebase/…

以上是关于Android:从firebase获取当前日期和时间的主要内容,如果未能解决你的问题,请参考以下文章

我需要将当前日期与其他数据一起添加到 firebase Realtime 数据库,并在 kotlin android 中检索所有带有日期的数据

使用 Firebase 3 从 FIRUser 获取创建日期和上次登录日期

在Recyclerview Android中从Firebase检索日期

iOS Swift - 获取当前本地时间和日期时间戳

在android中如何获取当前日期?

如何从firebase获取当前用户地址