You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android项目中获取UTC时间的当前Unix时间戳(网络时间)

获取可信网络Unix时间戳用于Firebase存储

嘿,我懂你的需求——要存到Firebase的得是可信的网络时间戳,而不是用户设备可能被篡改的系统时间对吧?这里有几个靠谱的方案,都是Android端能直接实现的:

方法1:调用公开网络时间API

这是最直接的方式,通过请求第三方可信时间接口获取准确时间。下面用OkHttp来实现(如果项目还没引入OkHttp,记得在Module级别的build.gradle里添加依赖):

// 先添加OkHttp依赖到build.gradle(Module)
// implementation 'com.squareup.okhttp3:okhttp:4.11.0'

fun getNetworkUnixTimestamp(callback: (Long?) -> Unit) {
    val client = OkHttpClient()
    val request = Request.Builder()
        .url("https://worldtimeapi.org/api/ip") // 该接口返回当前UTC时间信息
        .build()

    client.newCall(request).enqueue(object : Callback {
        override fun onFailure(call: Call, e: IOException) {
            callback(null) // 请求失败时返回null,可在此处理错误逻辑
        }

        override fun onResponse(call: Call, response: Response) {
            response.body?.string()?.let { responseBody ->
                try {
                    val jsonObject = JSONObject(responseBody)
                    val dateTimeString = jsonObject.getString("datetime")
                    val formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME
                    val zonedDateTime = ZonedDateTime.parse(dateTimeString, formatter)
                    // 秒级Unix时间戳,如需毫秒级用 zonedDateTime.toInstant().toEpochMilli()
                    val unixTimestamp = zonedDateTime.toEpochSecond()
                    callback(unixTimestamp)
                } catch (e: Exception) {
                    callback(null) // 解析失败时返回null
                }
            } ?: run {
                callback(null)
            }
        }
    })
}

使用时只需调用这个方法,在回调里拿到时间戳再存入Firebase即可。记得在AndroidManifest.xml中添加网络权限:

<uses-permission android:name="android.permission.INTERNET" />

方法2:利用Firebase自身的服务器时间

如果你已经在使用Firebase Realtime Database,这可能是最适配的方案——Firebase提供了直接获取服务器时间的API,完全不需要额外请求第三方接口:

// 获取Firebase服务器的毫秒级Unix时间戳占位符
val serverTimestamp = ServerValue.TIMESTAMP
// 写入数据库时,Firebase会自动将该占位符替换为真实的服务器时间戳
firebaseDatabase.getReference("your_target_path")
    .child("timestamp")
    .setValue(serverTimestamp)

这个方法的优势在于:

  • 完全依赖Firebase服务器时间,可信度拉满
  • 避免了“获取时间”到“写入Firebase”之间的时间差问题
  • 如果需要秒级时间戳,写入后读取回来再除以1000转换即可

注意事项

  • 网络请求可能失败(比如无网),所以一定要处理回调中的null情况,可考虑将系统时间作为最后备选(但要注明系统时间不可信)
  • 若使用方法1,建议对请求结果做缓存,避免频繁请求浪费资源
  • 方法2仅适用于直接写入Firebase的场景,如果需要先获取时间做其他业务逻辑,还是得用方法1

内容的提问来源于stack exchange,提问作者sumeet bhujang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:06:23