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

如何在Flutter/Dart中获取Firebase实时数据库的服务器时间戳?

在Flutter中使用Firebase实时数据库的服务器时间戳

写入数据时直接使用服务器时间戳(推荐)

Firebase实时数据库的Flutter SDK已经内置了服务器时间戳的实现,你可以用ServerValue.timestamp作为字段值,当数据提交到服务器时,Firebase会自动将这个值替换为服务器当前的毫秒级Unix时间戳,完全避免客户端时间的安全问题。

示例代码:

import 'package:firebase_database/firebase_database.dart';

void sendMessage(String content, String senderId) {
  // 生成新的消息节点
  final newMessageRef = FirebaseDatabase.instance.ref('messages').push();
  // 写入消息内容,timestamp使用服务器时间戳
  newMessageRef.set({
    'content': content,
    'senderId': senderId,
    'timestamp': ServerValue.timestamp,
  });
}

读取数据时,把返回的时间戳转成DateTime即可:

void listenToMessages() {
  FirebaseDatabase.instance.ref('messages').onValue.listen((event) {
    for (var messageSnapshot in event.snapshot.children) {
      final messageData = messageSnapshot.value as Map<dynamic, dynamic>;
      int timestamp = messageData['timestamp'] as int;
      DateTime messageTime = DateTime.fromMillisecondsSinceEpoch(timestamp);
      print("消息发送时间:$messageTime");
    }
  });
}

提前获取服务器时间(如需本地逻辑使用)

如果你的业务需要在写入数据前就拿到服务器时间(比如做本地校验),可以通过读取数据库内置的.info/serverTimeOffset节点来计算:

Future<int> getCurrentServerTimestamp() async {
  final offsetRef = FirebaseDatabase.instance.ref('.info/serverTimeOffset');
  final snapshot = await offsetRef.get();
  // 偏移量是本地时间与服务器时间的差值(毫秒)
  int serverTimeOffset = snapshot.value as int;
  // 本地时间加上偏移量得到服务器当前时间(毫秒级)
  return DateTime.now().millisecondsSinceEpoch + serverTimeOffset;
}

注意:优先使用ServerValue.timestamp写入,因为它是服务器直接生成的,最可靠;提前获取的方式会有微小的延迟误差,适合非核心逻辑场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:54:56