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

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

【问题讨论】:

    标签: android firebase firebase-realtime-database timestamp


    【解决方案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());
    

    【讨论】:

    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多