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

我有

FieldValue.serverTimestamp()

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

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案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 无关)。我想任何时候可以满足您的目的的服务器都可以。
      猜你喜欢
      • 2019-01-25
      • 2011-12-30
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多