Flutter:Firebase FieldValue.serverTimestamp() 到 DateTime 对象

Posted

技术标签:

【中文标题】Flutter:Firebase FieldValue.serverTimestamp() 到 DateTime 对象【英文标题】:Flutter: Firebase FieldValue.serverTimestamp() to DateTime object 【发布时间】:2019-12-16 00:34:29 【问题描述】:

我有

FieldValue.serverTimestamp()

我找不到在 Flutter 中将此时间戳转换为 DateTime 对象的方法。有什么办法吗?或者任何其他使用 firebase 的 API 调用?

【问题讨论】:

【参考方案1】:

好的,这在 我的情况 中是一种解决方法。我正在使用 json_annotation、json_serilaizable、build_runner。

这些是库版本:

json_serializable: ^5.0.2

build_runner: ^2.1.2

json_annotation: ^4.1.0

part 'podcast_comment_model.g.dart';

@JsonSerializable()
class CommentModel extends BaseModel 
  final String? id;
  final String podcastId;
  final String? comment;

  @JsonKey(
    fromJson: ServerTimestampConverter.fromJson,
    toJson: ServerTimestampConverter.toJson,
  )
  Object? dueDate;
  final CreatorModel? creator;

  CommentModel(
    required this.id,
    required this.podcastId,
    this.comment,
    this.creator,
    this.dueDate,
  );

  factory CommentModel.fromJson(Map<String, dynamic> json) 
    return _$CommentModelFromJson(json);
  

  Map<String, dynamic> toJson() => _$CommentModelToJson(this);

  @override
  CommentEntity toEntity() 
    return CommentEntity(
      id: this.id,
      podcastId: this.podcastId,
      dueDate: ServerTimestampConverter.fromJson(this.dueDate),
      creator: this.creator?.toEntity(),
      comment: this.comment,
    );
  


class ServerTimestampConverter 
  static DateTime? fromJson(Object? json) 
   if (json is Timestamp) 
        return json.toDate();
  
    return null;


  static Object? toJson(Object? fieldValue) 
    print('toJson is FieldValue fireStore object $fieldValue');
    return fieldValue as FieldValue;
  

我希望它有用。

【讨论】:

【参考方案2】:

如果您的文档中有serverTimeStamp 字段,您可以将其转换为DateTime,如下所示;

final DateTime dateTimeFromServerTimeStamp =
 (documentSnapshot.data()['serverTimeStamp'] as Timestamp).toDate();

【讨论】:

如果你已经知道它是一个时间戳,我发现你甚至不必写as Timestamp。只需在其后面加上toDate() 即可。您的 IDE 直到在运行时才知道它会工作,因此不会为您自动完成它,但它仍然可以工作。【参考方案3】:

假设您在 firebase 中使用了 serverTimeStamp,并且您正在读取它,您可以使用 DateTime.parse() 从 firebase 读取时间戳:

DateTime timestamp = DateTime.parse( json['ts'].toString() );

【讨论】:

似乎与在下载的 Timestamp 变量后添加.toDate() 完全相同......只是更复杂! :p 你每天都在学习新功能! 不是这样吗……! ?【参考方案4】:

FieldValue.serverTimestamp() 不是时间戳,而是所谓的哨兵——一个被发送到服务器的标记,服务器随后识别并解释它以写入当前时间戳。这意味着无法将FieldValue.serverTimestamp() 转换为客户端上的时间戳。

您可以做的是写入 FieldValue.serverTimestamp() 到服务器上的文档,并观察写入该文档的值。该值将是一个有效的时间戳。

【讨论】:

谢谢 Puf,您能否为此类工作推荐一个免费的 API? Google NTP可以用吗,我还想不通。任何建议将不胜感激。 我在那里没有任何建议(它们也与 Stack Overflow 无关)。我想任何时候可以满足您的目的的服务器都可以。

以上是关于Flutter:Firebase FieldValue.serverTimestamp() 到 DateTime 对象的主要内容,如果未能解决你的问题,请参考以下文章

没有创建 Firebase 应用“[DEFAULT]” - 在 Flutter 和 Firebase 中调用 Firebase.initializeApp()

用于 Flutter 桌面嵌入的 Firebase 身份验证插件

Flutter : getDownloadUrl (firebase 存储)

Flutter + Firebase:如何实现“谷歌登录”

在 Flutter 中访问 Firebase 存储

添加flutter_firebase_ui后flutter应用程序崩溃